diff --git a/.github/workflows/conda-package-build.yml b/.github/workflows/conda-package-build.yml index adfc7ca..ed7d257 100644 --- a/.github/workflows/conda-package-build.yml +++ b/.github/workflows/conda-package-build.yml @@ -19,7 +19,5 @@ on: jobs: build: uses: openalea/action-build-publish-anaconda/.github/workflows/openalea_ci.yml@main - with: - conda-directory: "./stat_tool/conda" secrets: anaconda_token: ${{ secrets.ANACONDA_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a257a46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ +*.py[cod] +.DS_Store +# C extensions +*.so + +# Packages +*.egg +*.egg-info +build +eggs +.eggs +parts +var +sdist +debian/ +develop-eggs +.installed.cfg +lib +lib64 +MANIFEST +**/__pycache__ +**/vpsequence_analysis +CMakeFiles + +# Installer logs +pip-log.txt +npm-debug.log +pip-selfcheck.json + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml +htmlcov +.cache +.pytest_cache +.mypy_cache + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# SQLite +test_exp_framework + +# npm +node_modules/ + +# dolphin +.directory +libpeerconnection.log + +# setuptools +dist + +# IDE Files +atlassian-ide-plugin.xml +.idea/ +*.swp +*.kate-swp +.ropeproject/ + +# Python3 Venv Files +.venv/ +bin/ +include/ +lib/ +lib64 +pyvenv.cfg +share/ +venv/ +.python-version + +# Cython +*.c + +# Emacs backup +*~ + +# VSCode +/.vscode + +# Automatically generated files +docs/preconvert +site/ +out + +# Sphinx +_static diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1f16728 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,198 @@ +# Initialize the CMake project +cmake_minimum_required(VERSION 3.20) + +################################################## +# If we are running in a Conda environment, we automatically +# add the Conda env prefix to the CMAKE_PREFIX_PATH + +if(DEFINED ENV{CONDA_PREFIX}) + list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}") + #TODO: Windows Conda environments are structured differently, + # how unfortunate is this? + list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}/Library") +endif() + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include("Anaconda") + +################################################## +# Define the version + +if(SKBUILD) + set(SEQANA_TOOL_VERSION ${SKBUILD_PROJECT_VERSION}) +else() + set(SEQANA_VERSION "2.0.0") +endif() + +project(openalea.sequence_analysis + VERSION ${SEQANA_VERSION} + LANGUAGES CXX + DESCRIPTION "Statistical analysis of plant architecture sequences") + +################################################## +# Set CMake policies for this project + +# We allow _ROOT (env) variables for locating dependencies using find_paclage +cmake_policy(SET CMP0074 NEW) +# We allow target_sources to convert relative paths to absolute paths +cmake_policy(SET CMP0076 NEW) + # for Python*_FIND_STRATEGY=LOCATION +cmake_policy(SET CMP0094 NEW) +cmake_policy(SET CMP0167 NEW) +################################################## +# Initialize some default paths +# See https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html +include(GNUInstallDirs) + +################################################## +# Set C++ standard and compile options + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +# set(CMAKE_CXX_EXTENSIONS ON) + +# This may be set in pyproject.toml +set(CMAKE_VERBOSE_MAKEFILE ON) + +################################################## +# For Python bindings, we need to enable position-independent code +set(CMAKE_POSITION_INDEPENDENT_CODE ON) # For shared libs + +################################################## +# TODO : REMOVE? +# if(WIN32) +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -enable-stdcall-fixup -enable-auto-import -enable-runtime-pseudo-reloc -s") +# endif() + + +# RPath settings +set(CMAKE_SKIP_BUILD_RPATH FALSE) +set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +list( + FIND + CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} + isSystemDir +) +if("${isSystemDir}" STREQUAL "-1") + set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +endif("${isSystemDir}" STREQUAL "-1") + + +if (WIN32) + string(REGEX REPLACE "/W3" "/W0" ${CMAKE_CXX_FLAGS} "${${CMAKE_CXX_FLAGS}}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MD") + + # To fix compilation error with vc14 and boost + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DHAVE_SNPRINTF") +endif() + +# Options +option(WITH_EFENCE "Build with efence library" OFF) +option(WITH_TEST "Build tests" OFF) + +################################################## +# Add a library for sequence_analysis and its Python wrappers +add_library(oasequence_analysis SHARED) + +################################################## +# Find external dependencies +find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) +find_package(Boost REQUIRED COMPONENTS python) +# TODO + +find_library(STAT_TOOL_LIB NAMES oastat_tool) + +#find_package(openalea.stat_tool REQUIRED) + +################################################## +# Setup lib, inc, defines for C++ oastat_tool lib + +target_link_libraries(oasequence_analysis PUBLIC ${STAT_TOOL_LIB}) + +target_include_directories(oasequence_analysis + PUBLIC + ${Boost_INCLUDE_DIRS} + ${CONDA_ENV}include +) + +# Export symbols on Windows +# if (WIN32 OR MSVC) +# target_compile_definitions(oasequence_analysis PUBLIC STAT_TOOL_MAKEDLL) +# endif() + +# Optionally add efence +if(WITH_EFENCE) + find_library(EFENCE_LIBRARY NAMES efence) + if(EFENCE_LIBRARY) + target_link_libraries(oasequence_analysis PUBLIC efence) + target_compile_definitions(oasequence_analysis PUBLIC DEBUG) + else() + message(WARNING "Could not find efence library, disabling it") + endif() +endif() + +# Add files to build +add_subdirectory(src/cpp/sequence_analysis) + + +################################################## +# Add a Python binding library +python_add_library(_sequence_analysis MODULE) + +target_include_directories(oasequence_analysis + PUBLIC + "src/cpp" +) + +target_link_libraries(_sequence_analysis + PRIVATE + ${OASTAT_LIB} + oasequence_analysis + Boost::python + Python::Module + ) + + target_compile_definitions(_sequence_analysis PRIVATE BOOST_ALL_NO_LIB) + + # Control the output name of the produced shared library + set_target_properties(_sequence_analysis PROPERTIES PREFIX "") + set_target_properties(_sequence_analysis PROPERTIES OUTPUT_NAME "_sequence_analysis") + if(WIN32) + set_target_properties(_sequence_analysis PROPERTIES SUFFIX ".pyd") + elseif(APPLE) + set_target_properties(_sequence_analysis PROPERTIES SUFFIX ".so") + endif() + +add_subdirectory("src/wrapper/") + + +if(APPLE) + set_target_properties(_sequence_analysis PROPERTIES INSTALL_RPATH "@loader_path/.") +elseif(UNIX) + set_target_properties(_sequence_analysis PROPERTIES INSTALL_RPATH "$ORIGIN/.") +endif() + +################################################## +# Install targets and headers for sequence_analysis lib +install(TARGETS oasequence_analysis + RUNTIME DESTINATION "${CONDA_ENV}bin/" + LIBRARY DESTINATION "${CONDA_ENV}lib/" + ARCHIVE DESTINATION "${CONDA_ENV}lib/" +) + +install( + TARGETS + _sequence_analysis + DESTINATION "${SKBUILD_PLATLIB_DIR}/openalea/sequence_analysis" +) + +# Optionally handle tests +# TODO TO TEST +if(WITH_TEST) + enable_testing() + add_subdirectory(test/cpp) +endif() + diff --git a/README.md b/README.md new file mode 100644 index 0000000..84c9701 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Sequence Analysis + +_________________ + +[![Docs](https://readthedocs.org/projects/sequence_analysis/badge/?version=latest)](https://sequence_analysis.readthedocs.io/) +[![Build Status](https://github.com/openalea/sequence_analysis/actions/workflows/conda-package-build.yml/badge.svg?branch=main)](https://github.com/openalea/sequence_analysis/actions/workflows/conda-package-build.yml?query=branch%3Amaster) +[![License](https://img.shields.io/badge/License--CeCILL-C-blue)](https://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html) +[![Anaconda-Server Badge](https://anaconda.org/openalea3/sequence_analysis/badges/version.svg)](https://anaconda.org/openalea3/sequence_analysis) + +_________________ + +[Read Latest Documentation](https://sequence_analysis.readthedocs.io/) - [Browse GitHub Code Repository](https://github.com/openalea/sequence_analysis/) + +_________________ + +**sequence analysis** Basic Statistical tools used by different Structure Analysis libraries. + +### Contributors + +Thanks to all that ontribute making this package what it is ! + + + + + diff --git a/README.txt b/README.txt index 0492287..f740a27 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -vplants.stat_tool +openalea.sequence_analysis ----------------- Description @@ -31,5 +31,4 @@ qt >= 4.2 (on windows) Dependencies --------------------- -vplants.tool -vplants.stat_tool \ No newline at end of file +openalea.stat_tool diff --git a/SConstruct b/SConstruct deleted file mode 100644 index a3b8f4c..0000000 --- a/SConstruct +++ /dev/null @@ -1,55 +0,0 @@ -# -*-python-*- - -from openalea.sconsx import config, environ -import os, platform - - -pj = os.path.join -ALEASolution = config.ALEASolution - -options = Variables(['../options.py', 'options.py'], ARGUMENTS) -# Firstly get options in ../options.py and then in options.py and finally in ARGUMENTS -options.Add(BoolVariable('with_efence', 'build with efence library', False)) -options.Add(BoolVariable('with_test', 'build with efence library', False)) - - -tools = ['boost_python', 'openalea.stattool'] - -env = ALEASolution(options, tools) -env.AppendUnique(CXXFLAGS=['-x', 'c++', '-std=c++14']) - -if env['with_efence']: - env.AppendUnique(LIBS=['efence']) - -if (platform.system() != 'Windows' and - os.environ.get('CC') and - os.environ.get('CXX')): - - env.AppendUnique(CFLAGS=["-std=c14"]) - if (platform.system() == 'Darwin'): - env.AppendUnique(CXXFLAGS=['-stdlib=libc++']) - conda_prefix = os.environ['CONDA_PREFIX'] - conda_bin = pj(os.environ['CONDA_PREFIX'], 'bin') - - # To work with conda toolchain - env['AR'] = os.environ['AR'] - env['AS'] = os.environ['AS'] - env['CC'] = pj(conda_bin, os.environ['CC']) - env['CXX'] = pj(conda_bin, os.environ['CXX']) - env.PrependUnique( - CPPPATH=['%s/include'%(conda_prefix)], - CCFLAGS=['-fvisibility=hidden'], - LIBPATH=['%s/lib'%(conda_prefix)]) - -# Build stage -prefix = env['build_prefix'] -seqlib = SConscript(pj(prefix,"src/cpp/SConscript"), - exports='env') -SConscript(pj(prefix,"src/wrapper/SConscript"), - exports='env') - -if bool(env['with_test']): - SConscript(pj(prefix,"test/cpp/SConscript"), exports="env seqlib") - -Default("build") - diff --git a/cmake/Anaconda.cmake b/cmake/Anaconda.cmake new file mode 100644 index 0000000..1835fa4 --- /dev/null +++ b/cmake/Anaconda.cmake @@ -0,0 +1,133 @@ +# Anaconda Check +if (DEFINED ENV{CONDA_PREFIX}) + # Anaconda Environment + message(STATUS "Anaconda environment detected: " $ENV{CONDA_PREFIX}) + + set(CMAKE_INCLUDE_PATH "$ENV{CONDA_PREFIX}/include" ${CMAKE_INCLUDE_PATH}) + set(CMAKE_LIBRARY_PATH "$ENV{CONDA_PREFIX}/lib" ${CMAKE_LIBRARY_PATH}) + + if (DEFINED ENV{PREFIX}) + file(TO_CMAKE_PATH $ENV{PREFIX} TMP_CONDA_ENV) + else() + file(TO_CMAKE_PATH $ENV{CONDA_PREFIX} TMP_CONDA_ENV) + endif() + + if (WIN32) + set(CONDA_ENV "${TMP_CONDA_ENV}/Library/") + else() + set(CONDA_ENV "${TMP_CONDA_ENV}/") + endif() + + set(CONDA_PYTHON_ENV "${TMP_CONDA_ENV}/") + + set(USE_CONDA ON) + +else() + message(STATUS "Compilation outside an anaconda environment.") + set(USE_CONDA OFF) +endif() + + +if (DEFINED ENV{CONDA_BUILD}) + message(STATUS "Conda build detected. " $ENV{CONDA_BUILD}) + + if (WIN32) + set(Python_ROOT_DIR "${PREFIX}") + endif() + + # specify the cross compiler + #set(CMAKE_C_COMPILER $ENV{CC}) + #set(CMAKE_LINKER $ENV{LD}) + #set(CMAKE_AR $ENV{AR}) + #set(CMAKE_NM $ENV{NM}) + #set(CMAKE_RANLIB $ENV{RANLIB}) + #set(CMAKE_STRIP $ENV{STRIP}) + #set(CMAKE_INSTALL_NAME_TOOL $ENV{INSTALL_NAME_TOOL}) + + #if (APPLE) + # set(CMAKE_OSX_ARCHITECTURES $ENV{OSX_ARCH}) + #endif() + + #set(CMAKE_CXX_COMPILER $ENV{CXX}) + #set(CMAKE_CXX_COMPILER_RANLIB $ENV{RANLIB}) + #set(CMAKE_CXX_COMPILER_AR $ENV{AR}) + + # where is the target environment + set(CMAKE_FIND_ROOT_PATH $ENV{PREFIX} $ENV{BUILD_PREFIX}) + if (APPLE) + list(APPEND CMAKE_FIND_ROOT_PATH $ENV{CONDA_BUILD_SYSROOT} ) + endif() + if (WIN32) + list(APPEND CMAKE_FIND_ROOT_PATH $ENV{BUILD_PREFIX}/Library/usr $ENV{PREFIX}/Library/usr) + set(CMAKE_INCLUDE_PATH "$ENV{BUILD_PREFIX}/Library/usr/include" ${CMAKE_INCLUDE_PATH}) + set(CMAKE_LIBRARY_PATH "$ENV{BUILD_PREFIX}/Library/usr/lib" ${CMAKE_LIBRARY_PATH}) + endif() + if (UNIX) + # I add both old stype and new style cdts : https://github.com/conda-forge/cdt-builds#old-stylelegacy-vs-new-style-cdts + list(APPEND CMAKE_FIND_ROOT_PATH $ENV{BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot ) + list(APPEND CMAKE_FIND_ROOT_PATH $ENV{PREFIX}/x86_64-conda-linux-gnu/sysroot $ENV{PREFIX}/$ENV{HOST}/sysroot ) + + link_directories($ENV{BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot/lib64 $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot/lib64) + link_directories($ENV{BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot/lib $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot/lib) + link_directories($ENV{BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot/usr/lib64 $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot/usr/lib64) + link_directories($ENV{BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot/usr/lib $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot/usr/lib) + endif() + + message(STATUS "CMAKE_FIND_ROOT_PATH :") + foreach(dir ${CMAKE_FIND_ROOT_PATH}) + message(STATUS " - " ${dir}) + endforeach() + + # search for programs in the build host directories + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) + # for libraries and headers in the target directories + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + set(USE_CONDA_BUILD ON) +else() + set(USE_CONDA_BUILD OFF) +endif() + +function(oa_default_install) + if(USE_CONDA_BUILD) + set(CMAKE_INSTALL_PREFIX $ENV{PREFIX} CACHE PATH "..." FORCE) + elseif() + set(CMAKE_INSTALL_PREFIX ${CONDA_ENV} CACHE PATH "..." FORCE) + else() + set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/build CACHE PATH "..." FORCE) + endif() + message(STATUS "Default install prefix to " ${CMAKE_INSTALL_PREFIX}) +endfunction() + +if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + oa_default_install() +elseif (NOT DEFINED CMAKE_INSTALL_PREFIX) + oa_default_install() +else() + message(STATUS "Install Prefix: " ${CMAKE_INSTALL_PREFIX}) +endif() + +function(install_share sharedirectory project) + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${sharedirectory}/ DESTINATION "${CONDA_ENV}/share/${project}") +endfunction() + + +function(install_oalib libname) + message("Installing ${libname} in ${CONDA_ENV}lib/") + install(TARGETS ${libname} + RUNTIME DESTINATION "${CONDA_ENV}bin/" + LIBRARY DESTINATION "${CONDA_ENV}lib/" + ARCHIVE DESTINATION "${CONDA_ENV}lib/" + ) +endfunction() + +function(install_oabin libname) + message("Installing ${libname} in ${CONDA_ENV}bin/") + install(TARGETS ${libname} RUNTIME DESTINATION "${CONDA_ENV}bin/") +endfunction() + +function(install_oaheaders directory exclude) + message("Installing header from ${directory} in ${CONDA_ENV}include/") + install(DIRECTORY ${directory} DESTINATION "${CONDA_ENV}include/" FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" PATTERN ${exclude} EXCLUDE) +endfunction() diff --git a/conda/environment.yml b/conda/environment.yml new file mode 100644 index 0000000..6b13b67 --- /dev/null +++ b/conda/environment.yml @@ -0,0 +1,13 @@ +name: sequence_analysis_dev +channels: + - conda-forge + - openalea3 +dependencies: + - python + - pip + - boost + - matplotlib-base + - openalea.stat_tool + - pip: + - -e '..[test,dev,doc]' + diff --git a/conda/meta.yaml b/conda/meta.yaml index bf469f3..38ba187 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,35 +1,76 @@ + +{% set pyproject = load_file_data('../pyproject.toml', from_recipe_dir=True) %} +{% set name = pyproject.get('project').get('name') %} +{% set description = pyproject.get('project').get('description') %} +{% set version = environ.get('SETUPTOOLS_SCM_PRETEND_VERSION', "0.0.0.dev") %} +{% set license = pyproject.get('project').get('license') %} +{% set home = pyproject.get('project', {}).get('urls', {}).get('Homepage', '') %} +{% set build_deps = pyproject.get("build-system", {}).get("requires", []) %} +{% set deps = pyproject.get('project', {}).get('dependencies', []) %} +{% set conda_deps = pyproject.get('tool', {}).get('conda', {}).get('environment', {}).get('dependencies',[]) %} +{% set test_deps = pyproject.get('project', {}).get('optional-dependencies', {}).get('test',[]) %} + + + package: - name: openalea.sequence_analysis - version: 2.0.0 + name: {{ name }} + version: {{ version }} + source: path: .. -about: - home: http://openalea.gforge.inria.fr - license: GPL/LGPL - summary: Models and algorithms for sequence analysis - -# needs boost - this is now in defaults. the ioos boost is broken (and has been -# deprecated but still appears in the channel - 2015-08-02) build: - preserve_egg_dir: True number: 0 - script: python setup.py install --prefix=$PREFIX + preserve_egg_dir: True + script: + - {{ PYTHON }} -m pip install . --no-deps --ignore-installed --no-build-isolation -vv requirements: - # it doesn't really require python, but maybe that will fix - # the missing bin directory + host: + - python + {% for dep in build_deps %} + - {{ dep }} + {% endfor %} + - cmake + - make # [not win] + - openalea.stat_tool + - boost + build: - - python - - setuptools - - openalea.deploy - - scons - - openalea.sconsx - - boost - - openalea.stat_tool + - {{ compiler("cxx") }} + run: - - python - - boost - - openalea.stat_tool + - python + {% for dep in deps + conda_deps %} + - {{ dep }} + {% endfor %} + + + + +test: + imports: + - openalea.stat_tool + requires: + + {% for dep in test_deps %} + - {{ dep }} + {% endfor %} + + source_files: + - test/ + commands: + - pytest + + +about: + home: {{ home }} + summary: {{ description }} + license: {{ license }} + + +extra: + recipe-maintainers: + - Jean-Baptiste Durand diff --git a/doc/Doxyfile b/doc/Doxyfile index 3b90899..30d94c8 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -769,7 +769,7 @@ FILE_PATTERNS = # be searched for input files as well. # The default value is: NO. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -1779,7 +1779,7 @@ MAN_LINKS = NO # captures the structure of the code including all documentation. # The default value is: NO. -GENERATE_XML = NO +GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of diff --git a/doc/Makefile b/doc/Makefile index 854550e..12a34e6 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,98 +2,257 @@ # # You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXATUOBUILD = sphinx-autobuild +PAPER = +BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest - +.PHONY: help help: @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " html to make standalone HTML files" + @echo " rtdhtml Build html using same settings used on ReadtheDocs" + @echo " livehtml Make standalone HTML files and rebuild the documentation when a change is detected. Also includes a livereload enabled web server" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" +.PHONY: clean clean: - -rm -rf $(BUILDDIR)/* + rm -Rf xml + rm -Rf html + rm -rf $(BUILDDIR)/* + rm -rf generated/* + rm -rf auto_gallery/ + + +.PHONY: doxygen +doxygen: Doxyfile + $(DOXYGENBUILD) + @echo + @echo "Doxygen build finished. The HTML pages are in ./html." + -html: +.PHONY: html +html: doxygen $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." -dirhtml: +.PHONY: rtdhtml +rtdhtml: doxygen + $(SPHINXBUILD) -T -j auto -E -W --keep-going -b html -d $(BUILDDIR)/doctrees -D language=en . $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + + +.PHONY: livehtml +livehtml: doxygen + # @echo "$(SPHINXATUOBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html" + $(SPHINXATUOBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + +.PHONY: dirhtml +dirhtml: doxygen $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." -pickle: +.PHONY: singlehtml +singlehtml: doxygen + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: html-noplot +html-noplot: doxygen + $(SPHINXBUILD) -D plot_gallery=0 -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: pickle +pickle: doxygen $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." -json: +.PHONY: json +json: doxygen $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." -htmlhelp: +.PHONY: htmlhelp +htmlhelp: doxygen $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." +.PHONY: qthelp qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/MAppleT.qhcp" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/xarray.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/xarray.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: doxygen + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/MAppleT.qhc" + @echo "# mkdir -p $$HOME/.local/share/devhelp/xarray" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/xarray" + @echo "# devhelp" + +.PHONY: epub +epub: doxygen + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: doxygen + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." -latex: +.PHONY: latex +latex: doxygen $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." -pdf: latex - cd $(BUILDDIR)/latex; - make all-ps - cd ../.. +.PHONY: latexpdf +latexpdf: doxygen + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: doxygen + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." -changes: +.PHONY: text +text: doxygen + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: doxygen + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: doxygen + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: doxygen + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: doxygen + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: doxygen $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." -linkcheck: +.PHONY: linkcheck +linkcheck: doxygen $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." -doctest: +.PHONY: doctest +doctest: doxygen $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." -coverage: +.PHONY: coverage +coverage: doxygen $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage" + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: doxygen + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: doxygen + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/doc/api/classes.rst b/doc/api/classes.rst new file mode 100644 index 0000000..f46bbbb --- /dev/null +++ b/doc/api/classes.rst @@ -0,0 +1,9 @@ +Classes +------- + +.. doxygenclass:: sequence_analysis::HiddenSemiMarkov + :members: +.. doxygenclass:: sequence_analysis::MarkovianSequences + :members: +.. doxygenclass:: sequence_analysis::Sequences + :members: diff --git a/doc/api/constants.rst b/doc/api/constants.rst new file mode 100644 index 0000000..2faa7b8 --- /dev/null +++ b/doc/api/constants.rst @@ -0,0 +1,3 @@ +Constants +--------- + diff --git a/doc/api/enums.rst b/doc/api/enums.rst new file mode 100644 index 0000000..9161d7d --- /dev/null +++ b/doc/api/enums.rst @@ -0,0 +1,3 @@ +Enums +----- + diff --git a/doc/api/index.rst b/doc/api/index.rst new file mode 100644 index 0000000..31cc16d --- /dev/null +++ b/doc/api/index.rst @@ -0,0 +1,18 @@ +API Reference +============= + +.. toctree:: + :maxdepth: 2 + :caption: Python API: + + ../user/autosum.rst + + +.. toctree:: + :maxdepth: 2 + :caption: C++ API: + + classes + enums + constants + diff --git a/doc/conf.py b/doc/conf.py index 8767aae..db38765 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -1,290 +1,180 @@ # -*- coding: utf-8 -*- -# -# sequence_analysis documentation build configuration file, created by -# sphinx-quickstart on Fri Oct 6 12:50:27 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys import os -from os.path import join as pj +import subprocess +import sys +from importlib.metadata import metadata + +pkg_name = "sequence_analysis" +meta = metadata("openalea." + pkg_name) +release = meta.get("version") +# for example take major/minor +version = ".".join(release.split(".")[:3]) +author = meta["Author"].split(",")[0] + "et al." +desc = meta["Summary"] # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.abspath("..")) # to include the root of the package # -- General configuration ------------------------------------------------ -f = pj(os.path.dirname(__file__),'..','src', 'openalea', 'sequence_analysis','__version__.py') -d = {} -exec(compile(open(f, "rb").read(), f, 'exec'),d,d) -version= d['SEQUENCE_ANALYSIS_VERSION_STR'] - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = [ + "sphinx.ext.autodoc", # support for automatic inclusion of docstring + "sphinx.ext.autosummary", # generates autodoc summaries + "sphinx.ext.doctest", # inclusion and testing of doctest code snippets + "sphinx.ext.intersphinx", # support for linking to other projects + "sphinx.ext.imgmath", # support for math equations + "sphinx.ext.ifconfig", # support for conditional content + "sphinx.ext.viewcode", # support for links to source code + "sphinx.ext.coverage", # includes doc coverage stats in the documentation + "sphinx.ext.todo", # support for todo items + "sphinx.ext.napoleon", # support for numpy and google style docstrings + "sphinx_favicon", # support for favicon + "nbsphinx", # for integrating jupyter notebooks + "myst_parser", # for parsing .md files + "matplotlib.sphinxext.plot_directive", + "breathe", +] -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +nbsphinx_thumbnails = { + "examples/Segmentation": "_static/segmentation_thumb.png", +} + +nbsphinx_allow_errors = True +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] +autosummary_generate = True +exclude_patterns = ["_build", "_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", +} -# The encoding of source files. -#source_encoding = 'utf-8-sig' +# C++ API +breathe_projects = {"sequence_analysis": "xml"} +breathe_default_project = "sequence_analysis" +# Run doxygen when building on readthedocs +read_the_docs_build = os.environ.get("READTHEDOCS", None) == "True" +if read_the_docs_build: + subprocess.call("doxygen", shell=True) # The master toctree document. -master_doc = 'index' - +master_doc = "index" # General information about the project. -project = 'L-Py' -copyright = 'J.-B. Durand for Cirad-Inria-Inra under Cecill-C license' -author = 'J.-B. Durand, Y. Guedon et al.' - +project = pkg_name +copyright = "Cecill-C INRAE / INRIA / CIRAD" +author = author # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # -# The short X.Y version. -#version = u'1' -# The full version, including alpha/beta/rc tags. -release = '0' - # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - +language = "en" # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False - # -- Options for HTML output ---------------------------------------------- - # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -#html_theme = 'classic' -#html_theme = "sphinx_rtd_theme" -#html_theme_path = ["_themes", ] - +html_theme = "pydata_sphinx_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (relative to this directory) to use as a favicon of -# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - +html_theme_options = { + "header_links_before_dropdown": 6, + "sidebarwidth": 200, + "collapse_navigation": "false", + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/openalea/sequence_analysis", + "icon": "fa-brands fa-github", + }, + ], + "show_version_warning_banner": True, + "footer_start": ["copyright"], + "footer_center": ["sphinx-version"], + "secondary_sidebar_items": { + "**/*": ["page-toc", "edit-this-page", "sourcelink"], + "examples/no-sidebar": [], + }, +} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - +html_static_path = ["_static"] +html_logo = "_static/openalea_web.svg" +html_favicon = "_static/openalea_web.svg" # If false, no module index is generated. -#html_domain_indices = True - +html_domain_indices = True # If false, no index is generated. -#html_use_index = True - +html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False - +html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - +html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - +html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - +html_show_copyright = True # Output file base name for HTML help builder. -htmlhelp_basename = 'sequence_analysis' +htmlhelp_basename = "sequence_analysis_documentation" # -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). +latex_elements = {} latex_documents = [ - (master_doc, 'sequence_analysis.tex', 'sequence_analysis Documentation', - author, 'manual'), + ( + master_doc, + "sequence_analysis.tex", + "sequence_analysis Documentation", + "INRA / INRIA / CIRAD", + "manual", + ), ] -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - # -- Options for manual page output --------------------------------------- - # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'sequence_analysis', 'sequence_analysis Documentation', - [author], 1) + ( + master_doc, + "openalea.sequence_analysis", + "sequence_analysis Documentation", + [author], + 1, + ) ] -# If true, show URL addresses after external links. -#man_show_urls = False - - # -- Options for Texinfo output ------------------------------------------- - # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'L-Py', 'L-Py Documentation', - author, 'L-Py', ' L-Py is a simulation software that mixes L-systems construction with the Python high-level modeling language.', - 'Miscellaneous'), + ( + master_doc, + "sequence_analysis", + "sequence_analysis Documentation", + author, + "sequence_analysis", + "Anaylsis of sequences in tree architecture.", + "Miscellaneous", + ), ] +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {"python": ("https://docs.python.org/", None)} -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +breathe_projects = {"sequence_analysis": "xml"} +breathe_default_project = "sequence_analysis" diff --git a/doc/contents.rst b/doc/contents.rst deleted file mode 100644 index 0768d5f..0000000 --- a/doc/contents.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. Do not edit. -.. File automatically generated by sphinx_tools.py, revision 1695, on Fri Apr 10 14:18:41 2009 - -.. _sequence_analysis: - -.. module:: sequence_analysis - -VPlants Sequence_analysis documentation -####################################### - -Module description -================== - -.. sidebar:: Summary - - :Version: |version| - :Release: |release| - :Date: |today| - :Author: See `Authors`_ section - :ChangeLog: See `ChangeLog`_ section - -.. topic:: Overview - - .. include:: user/overview.txt - -Documentation -============= - -.. toctree:: - :maxdepth: 2 - :numbered: - - User Guide - Reference Guide - Administration - -- A `PDF <../latex/main.pdf>`_ version of |sequence_analysis| documentation is - available. - -.. seealso:: - - More documentation can be found on the - `openalea `__ wiki. - -Authors -======= - -.. include:: ../AUTHORS.txt - -ChangeLog -========= - -.. include:: ../ChangeLog.txt - -License -======= - -|sequence_analysis| is released under a Cecill-C License. - -.. note:: `Cecill-C `_ - license is a LGPL compatible license. - -.. |sequence_analysis| replace:: VPlants.Sequence_analysis diff --git a/doc/cpp/doxygen.conf b/doc/cpp/doxygen.conf index 4a1fef8..11a5918 100644 --- a/doc/cpp/doxygen.conf +++ b/doc/cpp/doxygen.conf @@ -25,7 +25,7 @@ DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. -PROJECT_NAME = vplants.sequence_analysis +PROJECT_NAME = sequence_analysis # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or diff --git a/doc/extra.md b/doc/extra.md new file mode 100644 index 0000000..0be6b92 --- /dev/null +++ b/doc/extra.md @@ -0,0 +1,23 @@ +# Additional resources for sequence_analysis + +```{include} ../CONTRIBUTING.md + :start-after: + :end-before +``` + +```{include} ../AUTHORS.md + :start-after: + :end-before +``` + +## License + +```{include} ../LICENSE + :start-after: + :end-before +``` + +```{include} ../CHANGELOG.md + :start-after: + :end-before +``` diff --git a/doc/fig7_1.png b/doc/fig7_1.png new file mode 100644 index 0000000..d14f933 Binary files /dev/null and b/doc/fig7_1.png differ diff --git a/doc/fig7_2.png b/doc/fig7_2.png new file mode 100644 index 0000000..440aa94 Binary files /dev/null and b/doc/fig7_2.png differ diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 0000000..982176d --- /dev/null +++ b/doc/index.md @@ -0,0 +1,18 @@ +# stat_tool + +## Official documentation for openalea.stat_tool + +```{toctree} +:maxdepth: 2 +:hidden: + +Home +Install +User guide +Usage +API Reference +More +``` + +```{include} ../README.md +``` diff --git a/doc/installation.md b/doc/installation.md new file mode 100644 index 0000000..5e718ea --- /dev/null +++ b/doc/installation.md @@ -0,0 +1,45 @@ +# Installation + +You must use conda environment : + +## Users + +### Create a new environment with stat_tool installed in there + +```bash + +mamba create -n stat_tool -c openalea3 -c conda-forge openalea.stat_tool +mamba activate stat_tool +``` + +Install stat_tool in a existing environment + +```bash +mamba install -c openalea3 -c conda-forge openalea.stat_tool +``` + +### (Optional) Test your installation + +```bash +mamba install -c conda-forge pytest +git clone https://github.com/openalea/stat_tool.git +cd stat_tool/test; pytest +``` + +## Developers + +### Install From source + +```bash +# Install dependency with conda +mamba env create -n phm -f conda/environment.yml +mamba activate stat_tool + +# Clone stat_tool and install +git clone https://github.com/openalea/stat_tool.git +cd stat_tool +pip install . + +# (Optional) Test your installation +cd test; pytest +``` diff --git a/doc/usage.md b/doc/usage.md new file mode 100644 index 0000000..2f934ea --- /dev/null +++ b/doc/usage.md @@ -0,0 +1,6 @@ +# Usage + +```{nbgallery} +examples/example1.ipynb +examples/example2.ipynb +``` diff --git a/doc/user/autosum.rst b/doc/user/autosum.rst index d16fc7c..493ed32 100644 --- a/doc/user/autosum.rst +++ b/doc/user/autosum.rst @@ -16,7 +16,7 @@ Data structures :undoc-members: :inherited-members: :show-inheritance: - :synopsis: hidden Semi Markov + :synopsis: hidden semi-Markov .. currentmodule:: openalea.sequence_analysis.hidden_variable_order_markov diff --git a/doc/user/visualea_beech1.rst b/doc/user/visualea_beech1.rst new file mode 100644 index 0000000..55c44fb --- /dev/null +++ b/doc/user/visualea_beech1.rst @@ -0,0 +1,19 @@ +Beech demo +=========== +.. sectionauthor:: Thomas Cokelaer + +.. dataflow:: Demo.ChangePoint_stat_tool beech1 + :width: 50% + + test + + + +.. plot:: + :width: 40% + + from openalea.core.alea import * + pm = PackageManager() + run_and_display(('Demo.ChangePoint_stat_tool', 'beech1'),{},pm=pm) + + diff --git a/doc/user/visualea_oak_demo.rst b/doc/user/visualea_oak_demo.rst new file mode 100644 index 0000000..404abdb --- /dev/null +++ b/doc/user/visualea_oak_demo.rst @@ -0,0 +1,20 @@ +OAK demo +========= + +.. sectionauthor:: Thomas Cokelaer + + +.. dataflow:: Demo.ChangePoint_stat_tool oak_demo + :width: 50% + + test + + +.. plot:: + :width: 40% + + from openalea.core.alea import * + pm = PackageManager() + run_and_display(('Demo.ChangePoint_stat_tool', 'oak_demo'),{},pm=pm) + + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9f9f1a9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,100 @@ +[build-system] +requires = ["scikit-build-core", "setuptools_scm"] +build-backend = "scikit_build_core.build" + +[tool.setuptools] +include-package-data = false # force explicit declaration of data (disable automatic inclusion) + +[tool.setuptools.package-data] +"openalea.sequence_analysis" = ["data/**/*"] + +# enable dynamic version based on git tags +[tool.setuptools_scm] +fallback_version = "1.4.0.dev0" +version_scheme = "guess-next-dev" +local_scheme = "no-local-version" + +[tool.scikit-build] +build-dir = "./build/" +metadata.version.provider = "scikit_build_core.metadata.setuptools_scm" +logging.level = "WARNING" +build.verbose = true +sdist.include = ["*.so", "*.dylib", "*.dll", "*.pyd", "*.lib"] +editable.rebuild = true +experimental = false +search.site-packages = false + +[tool.scikit-build.cmake] +build-type = "Release" +source-dir = "." + +[tool.scikit-build.cmake.define] +WITH_TEST = false +WITH_EFENCE = false + +[tool.scikit-build.wheel.packages] +"openalea/sequence_analysis" = "src/openalea/sequence_analysis" +"openalea/seqint" = "src/openalea/seqint" + +[project] +name = "openalea.sequence_analysis" +authors = [ + { name = "Yann Guédon" }, + { name = "Jean-Baptiste Durand" }, + { name = "Thomas Cokelaer" }, + { name = "Christophe Pradal"}, + { name = "Thomas Arsouze" }, +] +description = "Statistical analysis of plant architecture sequences" +readme = "README.md" +license = "GPL-2.0" +license-files = ["LICEN[CS]E*"] +requires-python = ">=3.10" +dynamic = ["version"] +classifiers = [ + "Development Status :: 1 - Planning", + "Intended Audience :: Science/Research", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Scientific/Engineering", +] + +# you can list here all dependencies that are pip-instalable, and that have a name identical to the one used by conda (to allow reuse of this list in meta.yaml) +# If conda name is different, please do not declare the pip name, and declare conda name in the next section +dependencies = [] # == install_requires + +[project.optional-dependencies] +test = ["pytest", "nbmake"] +dev = ["pytest >=6", "pytest-cov >=3"] +doc = [ + "sphinx-autobuild", + "pydata-sphinx-theme", + "myst-parser", + "sphinx-favicon", + "ipykernel", + "sphinx-copybutton", + "ipython_genutils", + "nbsphinx", + "ninja", + "breathe", +] + +# section specific to conda-only distributed package (not used by pip yet) +[tool.conda.environment] +channels = ["openalea3", "conda-forge"] +dependencies = ["boost", "matplotlib-base", "openalea.stat_tool", "doxygen"] + +[project.urls] +Repository = "https://github.com/openalea/sequence_analysis" +Homepage = "https://sequence_analysis.readthedocs.io/" +"Bug Tracker" = "https://github.com/openalea/sequence_analysis/issues" +Discussions = "https://github.com/openalea/sequence_analysis/discussions" +Changelog = "https://github.com/openalea/sequence_analysis/releases" + diff --git a/result b/result new file mode 100644 index 0000000..c0947eb --- /dev/null +++ b/result @@ -0,0 +1,22 @@ +value 95 96 97 +sample size 46 46 46 +mean 2.08696 1.19565 1.63043 +variance 0.170048 0.205314 0.282609 +standard deviation 0.412369 0.453116 0.53161 +mean absolute deviation 0.202268 0.323251 0.493384 +coefficient of concentration 0.0584239 0.137945 0.15913 +coefficient of skewness 2.64171 2.3056 -0.08945 +coefficient of kurtosis 9.96979 4.16166 -1.08981 + + frequency distribution 95 frequency distribution 96 frequency distribution 97 cumulative distribution 95 function cumulative distribution 96 function cumulative distribution 97 function +0 0 0 0 0 0 0 +1 1 38 18 0.0217391 0.826087 0.391304 +2 41 7 27 0.913043 0.978261 0.978261 +3 3 1 1 0.978261 1 1 +4 1 1 + +Kruskal-Wallis test +chi-square test 2 degrees of freedom +chi-square value 58.1932 critical probability 2.30942e-13 +reference chi-square value 5.99146 reference critical probability 0.05 +reference chi-square value 9.21034 reference critical probability 0.01 diff --git a/sequence_analysis.py b/sequence_analysis.py deleted file mode 100644 index 13d30e0..0000000 --- a/sequence_analysis.py +++ /dev/null @@ -1,287 +0,0 @@ -"""Classes shared by most statistical modules -""" - - -import cstat_tool, os - -DistributionIdentifier=cstat_tool.DistributionIdentifier - -Parametric=cstat_tool._Parametric -Distribution=cstat_tool.Distribution -D_DEFAULT=cstat_tool.D_DEFAULT() -I_DEFAULT=cstat_tool.I_DEFAULT() -SELF_TRANSITION=cstat_tool.SELF_TRANSITION() -RestorationAlgorithm=cstat_tool.RestorationAlgorithm - -class _PlotManager: - """Manage the graphical outputs using Gnuplot.py.""" - def __init__(self, file_list, ref_prefix, nb_windows=1): - """Initialize a PlotManager. - - Argument file_list refers to the entire set of files generated by - the Plot command, ref_prefix to the prefix of the particular file - to be drawn and nb_windows to the number of graphs for that file.""" - import Gnuplot, sys, os - # print file_list - g=Gnuplot.Gnuplot() - self.__plot=g - cfile=open(ref_prefix+'.plot','r') - c_commands=cfile.readlines() - cfile.close() - py_commands= [] - l=[] - # extract the successive commands - for c in c_commands: - if 'pause' in c: - py_commands.append(l) - l= [] - continue - l.append(c) - gcommands=[ "".join(c) for c in py_commands] - cont=True - if nb_windows==1: - # one single frame to be printed - prompt='' - else: - prompt=': continue, ' - prompt+='

: print, : suspend, : quit\n' - frame=0 - sys.stderr.write(prompt) - while cont: - g(gcommands[frame]) - choice=sys.stdin.read(1) - if choice=='q': - cont=False - self.__plot=None - elif ((choice=='\n') and not(nb_windows==1)): - frame+=1 - if frame==len(gcommands): - frame=0 - elif choice=='s': - cont=False - elif choice=='p': - cont=False - self.__plot=None - cfile=open(ref_prefix+'.print','r') - g=Gnuplot.Gnuplot() - c_commands=cfile.read() - cfile.close() - # print c_commands - c_commands=self.__replacestr(c_commands, 'postscript', - 'postscript color') - # similar replacement can be performed for the file name - # seek for keyword "set output" - strseek="SET OUTPUT" - pos=c_commands.upper().find(strseek) - if pos != -1: - endlpos=c_commands.find("\n",pos) - file_name=c_commands[pos+len(strseek):endlpos] - print "graph printed to" + str(file_name) + "\n" - g(c_commands) - del g - for tmpfile in file_list: - os.remove(os.getcwd()+os.sep+tmpfile) - - def __replacestr(self, message, string, subst): - # replace string by subst in message - index=0 - while index < len(message): - i=message.find(string, index) - if (i==-1) or (i+len(string)+1 >= len(message)): - # subchain string has not been found or this is the last word - return message - else: - index=i+1 - message=message[0:i]+str(subst) \ - +message[i+len(string):len(message)] - return message - -class FormatError(Exception): - """Exceptions related to the statistical modules.""" - - def __init__(self, error=None): - """Initialize a FormatError exception.""" - if error is None: - self.__error="" - else: - self.__error=error - - def _error(self): - return str(self.__error) - - def __str__(self): - return str(self.__error) - -class Histogram: - """Histograms.""" - - def __init__(self, histogram): - """Initialize an Histogram by copy.""" - if issubclass(histogram.__class__, Histogram): - # histogram is supposed to be a Histogram... - self.__histo=cstat_tool.Histogram(histogram.__histo) - elif issubclass(histogram.__class__, cstat_tool.Histogram): - # ... or a cstat_tool.Histogram... - self.__histo=cstat_tool.Histogram(histogram) - elif issubclass(histogram.__class__, cstat_tool.Distribution): - # ... or a cstat_tool.Distribution... - self.__histo=cstat_tool.Histogram(histogram) - else: - # ... or a sample of int - try: - chisto=cstat_tool.Histogram(histogram) - except RuntimeError, error: - raise FormatError, error - else: - self.__histo=chisto - - def Display(self, Detail=None, ViewPoint=None): - """Display the Histogram using an ASCII output. - - Usage: Display(ViewPoint="Survival") - Display(Detail=2)""" - if ViewPoint is None: - # Display(Detail=2) - if Detail is None: - Detail=1 - if Detail==1: - exhaustive=False - elif Detail==2: - exhaustive=True - elif type(Detail)!=int: - msg="Bad type for 'Detail' argument:"+str(type(Detail)) \ - +" - expecting type 'int'" - raise TypeError, msg - else: - msg="Bad value for 'Detail' argument:"+str(Detail) \ - +" - expecting 1 or 2" - raise ValueError, msg - try: - # s=cstat_tool.Histogram.display(self.__histo, exhaustive) - s=self.__histo.display(exhaustive) - except RuntimeError, f: - raise FormatError, f - print s - else: - # Display(ViewPoint="Survival") - if Detail is None: - if type(ViewPoint)!=str: - msg="bad type for 'ViewPoint' argument:" + \ - str(type(ViewPoint)) + " - expecting type 'str'" - raise TypeError, msg - elif ViewPoint.upper()!="SURVIVAL": - msg="Bad value for 'ViewPoint' argument:" + str(Detail) \ - +" - expecting 'Survival'" - raise ValueError, msg - try: - s=self.__histo.display_survival() - except RuntimeError, f: - raise FormatError, f - print s - else: - msg="Display must be used with either 'Detail' or with " + \ - "'ViewPoint' parameter, not both" - raise ValueError, msg - - def Plot(self, ViewPoint=None, Title=""): - """Graphical output of the Histogram using Gnuplot.py. - - Usage: Plot(Title="Any Title") - Plot(ViewPoint="Survival", Title="Any Title")""" - if not(ViewPoint is None): - if type(ViewPoint)!=str: - msg="bad type for 'ViewPoint' argument:"+str(type(ViewPoint)) \ - +" - expecting type 'str'" - raise TypeError, msg - elif ViewPoint.upper()!="SURVIVAL": - msg="Bad value for 'ViewPoint' argument:"+str(Detail) \ - +" - expecting 'Survival'" - raise ValueError, msg - import os - prefix="ftmp" - file_created=False - # find a non existing file name - while not file_created: - try: - cfile=open(prefix+'.plot','r') - except IOError: - # file does not exist - # file_list= [prefix+extension for extension in \ - # [".plot", "1.dat", "0.dat", ".print"]] - file_created=True - else: - import random - prefix+=str(random.randint(1,9)) - try: - file_list=[] - if ViewPoint is None: - self.__histo.plot_write(os.getcwd()+os.sep+prefix, Title) - else: - self.__histo.plot_write_survival(os.getcwd()+os.sep+prefix, - Title) - # build the list of the files actually created: - for var in range(3): - filename=prefix+str(var) - try: - tmpfile=open(filename+'.dat', 'r') - except IOError: - pass - else: - tmpfile.close() - # add the .dat file - file_list+=[filename+'.dat'] - file_list+=[prefix+extension - for extension in [".plot", ".print"]] - except RuntimeError, f: - for tmpfile in file_list: - os.remove(os.getcwd()+os.sep+tmpfile) - raise FormatError, f - else: - if ViewPoint==None: - nb_windows=1 - else: - nb_windows=3 - self.__plot=_PlotManager(file_list, prefix, nb_windows) - - def Save(self, file_name, Format="ASCII", Detail=2): - """Save the Histogram into a file, using "ASCII" or - "SPREADSHEET" format and a level of detail 1 or 2. - - Usage: Save("my_filename.txt", Format="ASCII", Detail=2) - Save("my_filename.txt", "Spreadsheet")""" - if not (Format.upper()=="ASCII" - or Format.upper()=="SPREADSHEET"): - msg="unknown file format: "+str(format) - raise ValueError, msg -## elif not (ViewPoint.upper()=="DATA" -## or ViewPoint.upper()=="SURVIVAL"): -## msg="unknown viewpoint: "+str(format) -## raise ValueError, msg - if Detail==1: - exhaustive=False - elif Detail==2: - exhaustive=True - elif type(Detail)==int: - msg="invalid level of detail: "+str(Detail) - raise ValueError, msg - else: - msg="invalid type for detail: "+str(type(Detail)) - raise TypeError, msg - if Format.upper()=="ASCII": - try: - self.__histo.ascii_write(file_name, exhaustive) - except RuntimeError, error: - raise FormatError, error - else: - try: - self.__histo.spreadsheet_write(file_name)#, exhaustive) - except RuntimeError, error: - raise FormatError, error - - def _chisto(self): - return(self.__histo) - - def __str__(self): - return str(self.__histo) - - diff --git a/src/cpp/SConscript b/src/cpp/SConscript deleted file mode 100644 index db46e47..0000000 --- a/src/cpp/SConscript +++ /dev/null @@ -1,53 +0,0 @@ -# -*-python-*- - -import os -bn = os.path.basename - -Import( "env" ) - -lib_env = env.Clone() -#lib_env.EnableQt4Modules(['QtCore','QtOpenGL', 'QtGui']) - -# Import / Export symbols for windows dll -if lib_env['compiler'] == 'mingw': - LINKFLAGS=["-enable-stdcall-fixup", - "-enable-auto-import", - "-enable-runtime-pseudo-reloc", - "-s"] - lib_env.AppendUnique(LINKFLAGS=LINKFLAGS) - - -includes= lib_env.ALEAGlob('*.h') -includes += lib_env.ALEAGlob('*.hpp') -sources = lib_env.ALEAGlob('*.cpp') - -# files to exclude from sources -excludes = Split( """ -""") - -for f in excludes: - for cpp in sources: - if f in cpp: - sources.remove(cpp) - break - -# Add defines to export symbols -lib_env.AppendUnique(CPPDEFINES=['MESSAGE']) -#lib_env.AppendUnique(LIBS=['vptool', 'vpstat_tool']) -lib_env.AppendUnique(LIBS=['vpstat_tool']) - -if lib_env['with_efence']: - lib_env.AppendUnique(LIBS=['efence']) - -if lib_env['debug']: - lib_env.Append(CPPDEFINES= ['DEBUG']) - - if '-DNDEBUG' in lib_env._dict['CCFLAGS']: - lib_env._dict['CCFLAGS'] = [] - if '-DNDEBUG' in lib_env._dict['CXXFLAGS']: - lib_env._dict['CXXFLAGS'] = [] - -inc = lib_env.ALEAIncludes( "sequence_analysis", includes) -lib, install_lib = lib_env.ALEALibrary( "vpsequence", sources) - -Return('lib') diff --git a/src/cpp/sequence_analysis/CMakeLists.txt b/src/cpp/sequence_analysis/CMakeLists.txt new file mode 100644 index 0000000..9866392 --- /dev/null +++ b/src/cpp/sequence_analysis/CMakeLists.txt @@ -0,0 +1,20 @@ +# Glob includes and sources +file(GLOB HEADERS "*.h" "*.hpp") +file(GLOB SOURCES "*.cpp") + + +target_include_directories(oasequence_analysis PUBLIC .) + +target_sources( + oasequence_analysis + PRIVATE + ${SOURCES} +) + +# Add the headers to be installed with the library + +# Add the headers to be installed with the library +install( + FILES ${HEADERS} + DESTINATION "${CONDA_ENV}include/sequence_analysis" +) \ No newline at end of file diff --git a/src/cpp/alignment.cpp b/src/cpp/sequence_analysis/alignment.cpp similarity index 100% rename from src/cpp/alignment.cpp rename to src/cpp/sequence_analysis/alignment.cpp diff --git a/src/cpp/categorical_sequence_process1.cpp b/src/cpp/sequence_analysis/categorical_sequence_process1.cpp similarity index 97% rename from src/cpp/categorical_sequence_process1.cpp rename to src/cpp/sequence_analysis/categorical_sequence_process1.cpp index 0ee41a0..b4d2e35 100644 --- a/src/cpp/categorical_sequence_process1.cpp +++ b/src/cpp/sequence_analysis/categorical_sequence_process1.cpp @@ -481,10 +481,12 @@ void CategoricalSequenceProcess::copy(const CategoricalSequenceProcess &process if (process.first_occurrence) { first_occurrence = new Distribution*[nb_value]; for (i = 0;i < nb_value;i++) { - first_occurrence[i] = new Distribution(*(process.first_occurrence[i])); - } - } - else { + if (process.first_occurrence[i]) + first_occurrence[i] = new Distribution(*(process.first_occurrence[i])); + else + first_occurrence[i] = NULL; + } + } else { first_occurrence = NULL; } @@ -501,12 +503,10 @@ void CategoricalSequenceProcess::copy(const CategoricalSequenceProcess &process if (process.recurrence_time) { recurrence_time = new Distribution*[nb_value]; for (i = 0;i < nb_value;i++) { - if (process.recurrence_time[i]) { - recurrence_time[i] = new Distribution(*(process.recurrence_time[i])); - } - else { - recurrence_time[i] = NULL; - } + if (process.recurrence_time[i]) + recurrence_time[i] = new Distribution(*(process.recurrence_time[i])); + else + recurrence_time[i] = NULL; } } else { @@ -541,7 +541,10 @@ void CategoricalSequenceProcess::copy(const CategoricalSequenceProcess &process if (process.nb_run) { nb_run = new Distribution*[nb_value]; for (i = 0;i < nb_value;i++) { - nb_run[i] = new Distribution(*(process.nb_run[i])); + if (process.nb_run[i]) + nb_run[i] = new Distribution(*(process.nb_run[i])); + else + nb_run[i] = NULL; } } else { @@ -551,7 +554,10 @@ void CategoricalSequenceProcess::copy(const CategoricalSequenceProcess &process if (process.nb_occurrence) { nb_occurrence = new Distribution*[nb_value]; for (i = 0;i < nb_value;i++) { - nb_occurrence[i] = new Distribution(*(process.nb_occurrence[i])); + if (process.nb_occurrence[i]) + nb_occurrence[i] = new Distribution(*(process.nb_occurrence[i])); + else + nb_occurrence[i] = NULL; } } else { diff --git a/src/cpp/categorical_sequence_process2.cpp b/src/cpp/sequence_analysis/categorical_sequence_process2.cpp similarity index 100% rename from src/cpp/categorical_sequence_process2.cpp rename to src/cpp/sequence_analysis/categorical_sequence_process2.cpp diff --git a/src/cpp/change_points1.cpp b/src/cpp/sequence_analysis/change_points1.cpp similarity index 100% rename from src/cpp/change_points1.cpp rename to src/cpp/sequence_analysis/change_points1.cpp diff --git a/src/cpp/change_points2.cpp b/src/cpp/sequence_analysis/change_points2.cpp similarity index 100% rename from src/cpp/change_points2.cpp rename to src/cpp/sequence_analysis/change_points2.cpp diff --git a/src/cpp/change_points3.cpp b/src/cpp/sequence_analysis/change_points3.cpp similarity index 100% rename from src/cpp/change_points3.cpp rename to src/cpp/sequence_analysis/change_points3.cpp diff --git a/src/cpp/change_points4.cpp b/src/cpp/sequence_analysis/change_points4.cpp similarity index 100% rename from src/cpp/change_points4.cpp rename to src/cpp/sequence_analysis/change_points4.cpp diff --git a/src/cpp/continuous_parametric_sequence_estimation.hpp b/src/cpp/sequence_analysis/continuous_parametric_sequence_estimation.hpp similarity index 100% rename from src/cpp/continuous_parametric_sequence_estimation.hpp rename to src/cpp/sequence_analysis/continuous_parametric_sequence_estimation.hpp diff --git a/src/cpp/correlation.cpp b/src/cpp/sequence_analysis/correlation.cpp similarity index 100% rename from src/cpp/correlation.cpp rename to src/cpp/sequence_analysis/correlation.cpp diff --git a/src/cpp/hidden_semi_markov.cpp b/src/cpp/sequence_analysis/hidden_semi_markov.cpp similarity index 100% rename from src/cpp/hidden_semi_markov.cpp rename to src/cpp/sequence_analysis/hidden_semi_markov.cpp diff --git a/src/cpp/hidden_semi_markov.h b/src/cpp/sequence_analysis/hidden_semi_markov.h similarity index 100% rename from src/cpp/hidden_semi_markov.h rename to src/cpp/sequence_analysis/hidden_semi_markov.h diff --git a/src/cpp/hidden_variable_order_markov.cpp b/src/cpp/sequence_analysis/hidden_variable_order_markov.cpp similarity index 100% rename from src/cpp/hidden_variable_order_markov.cpp rename to src/cpp/sequence_analysis/hidden_variable_order_markov.cpp diff --git a/src/cpp/hidden_variable_order_markov.h b/src/cpp/sequence_analysis/hidden_variable_order_markov.h similarity index 100% rename from src/cpp/hidden_variable_order_markov.h rename to src/cpp/sequence_analysis/hidden_variable_order_markov.h diff --git a/src/cpp/hsmc_algorithms1.cpp b/src/cpp/sequence_analysis/hsmc_algorithms1.cpp similarity index 98% rename from src/cpp/hsmc_algorithms1.cpp rename to src/cpp/sequence_analysis/hsmc_algorithms1.cpp index 1c9ebf6..8257c78 100644 --- a/src/cpp/hsmc_algorithms1.cpp +++ b/src/cpp/sequence_analysis/hsmc_algorithms1.cpp @@ -247,7 +247,8 @@ double HiddenSemiMarkov::likelihood_computation(const MarkovianSequences &seq , } state_norm[k] *= observation[j][k]; - norm[j] += state_norm[k]; + if (state_norm[k] > 0) + norm[j] += state_norm[k]; break; } @@ -262,7 +263,8 @@ double HiddenSemiMarkov::likelihood_computation(const MarkovianSequences &seq , } forward1[k] *= observation[j][k]; - norm[j] += forward1[k]; + if (forward1[k] > 0) + norm[j] += forward1[k]; break; } } @@ -351,7 +353,8 @@ double HiddenSemiMarkov::likelihood_computation(const MarkovianSequences &seq , for (k = 0;k < nb_state;k++) { state_in[j][k] = 0.; for (m = 0;m < nb_state;m++) { - state_in[j][k] += transition[m][k] * forward1[m]; + if (forward1[m] > 0) + state_in[j][k] += transition[m][k] * forward1[m]; } } } @@ -437,7 +440,7 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e int i , j , k , m , n; int max_nb_value , iter , nb_likelihood_decrease , offset , nb_value , *occupancy_nb_value = NULL, *censored_occupancy_nb_value = NULL, **pioutput = NULL; - double likelihood = D_INF , previous_likelihood , occupancy_likelihood , observation_likelihood , + double likelihood = D_INF , previous_likelihood = D_INF, occupancy_likelihood , observation_likelihood , min_likelihood , obs_product , residual , buff , sum , occupancy_mean , **observation , *norm = NULL, *state_norm = NULL, **forward1 = NULL, **state_in = NULL, *backward = NULL, **backward1 = NULL, *auxiliary = NULL, *ofrequency = NULL, *lfrequency = NULL, @@ -778,6 +781,13 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e // EM structure: iterate do { iter++; + if (likelihood > previous_likelihood) { + // save result + if (hsmarkov_best != NULL) + delete hsmarkov_best; + hsmarkov_best = new HiddenSemiMarkov(*hsmarkov); + } + previous_likelihood = likelihood; likelihood = 0.; @@ -962,7 +972,9 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e } state_norm[k] *= observation[j][k]; - norm[j] += state_norm[k]; + if (state_norm[k] > 0) + norm[j] += state_norm[k]; + break; } @@ -977,7 +989,8 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e } forward1[j][k] *= observation[j][k]; - norm[j] += forward1[j][k]; + if (forward1[j][k] > 0) + norm[j] += forward1[j][k]; break; } } @@ -1088,12 +1101,6 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e if (likelihood == D_INF) { break; } - if (likelihood > previous_likelihood) { - // save result - if (hsmarkov_best != NULL) - delete hsmarkov_best; - hsmarkov_best = new HiddenSemiMarkov(*hsmarkov); - } # ifdef DEBUG for (j = 0;j < length[i];j++) { @@ -1765,6 +1772,7 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e delete hsmarkov; hsmarkov = NULL; hsmarkov = new HiddenSemiMarkov(*hsmarkov_best); + // retrieve likelihood associated with model hsmarkov and data *this likelihood = hsmarkov->likelihood_computation(*this); delete hsmarkov_best; hsmarkov_best = NULL; @@ -1793,21 +1801,21 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e // reestimation of the initial probabilities if (!reload_prev_optimal) { - if (hsmarkov->type == ORDINARY) { - reestimation(hsmarkov->nb_state , chain_reestim->initial , - hsmarkov->initial , MIN_PROBABILITY , true); - } + if (hsmarkov->type == ORDINARY) { + reestimation(hsmarkov->nb_state , chain_reestim->initial , + hsmarkov->initial , MIN_PROBABILITY , true); + } - // reestimation of the transition probabilities + // reestimation of the transition probabilities - for (i = 0;i < hsmarkov->nb_state;i++) { - reestimation(hsmarkov->nb_state , chain_reestim->transition[i] , - hsmarkov->transition[i] , MIN_PROBABILITY , true); - } + for (i = 0;i < hsmarkov->nb_state;i++) { + reestimation(hsmarkov->nb_state , chain_reestim->transition[i] , + hsmarkov->transition[i] , MIN_PROBABILITY , true); + } - if (hsmarkov->type == EQUILIBRIUM) { - hsmarkov->initial_probability_computation(); - } + if (hsmarkov->type == EQUILIBRIUM) { + hsmarkov->initial_probability_computation(); + } } for (i = 0;i < hsmarkov->nb_state;i++) { @@ -1822,18 +1830,19 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_estimation(StatError &e } // reestimation of the categorical observation distributions - - for (i = 0;i < hsmarkov->nb_output_process;i++) { - if (hsmarkov->categorical_process[i]) { - for (j = 0;j < hsmarkov->nb_state;j++) { - reestimation(marginal_distribution[i]->nb_value , observation_reestim[i][j]->frequency , - hsmarkov->categorical_process[i]->observation[j]->mass , - MIN_PROBABILITY , true); + if (!reload_prev_optimal) { + for (i = 0;i < hsmarkov->nb_output_process;i++) { + if (hsmarkov->categorical_process[i]) { + for (j = 0;j < hsmarkov->nb_state;j++) { + reestimation(marginal_distribution[i]->nb_value , observation_reestim[i][j]->frequency , + hsmarkov->categorical_process[i]->observation[j]->mass , + MIN_PROBABILITY , true); + } } - } - else if (hsmarkov->discrete_parametric_process[i]) { - hsmarkov->discrete_parametric_process[i]->nb_value_computation(); + else if (hsmarkov->discrete_parametric_process[i]) { + hsmarkov->discrete_parametric_process[i]->nb_value_computation(); + } } } } @@ -2834,8 +2843,9 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_stochastic_estimation(S state_norm[k] += state_in[j - 1][k] - forward1[j - 1][k]; } state_norm[k] *= observation[j][k]; - - norm[j] += state_norm[k]; + + if (state_norm[j] > 0) + norm[j] += state_norm[k]; break; } @@ -2850,7 +2860,8 @@ HiddenSemiMarkov* MarkovianSequences::hidden_semi_markov_stochastic_estimation(S } forward1[j][k] *= observation[j][k]; - norm[j] += forward1[j][k]; + if (forward1[j][k] > 0) + norm[j] += forward1[j][k]; break; } } diff --git a/src/cpp/hsmc_algorithms2.cpp b/src/cpp/sequence_analysis/hsmc_algorithms2.cpp similarity index 100% rename from src/cpp/hsmc_algorithms2.cpp rename to src/cpp/sequence_analysis/hsmc_algorithms2.cpp diff --git a/src/cpp/hvomc_algorithms1.cpp b/src/cpp/sequence_analysis/hvomc_algorithms1.cpp similarity index 100% rename from src/cpp/hvomc_algorithms1.cpp rename to src/cpp/sequence_analysis/hvomc_algorithms1.cpp diff --git a/src/cpp/hvomc_algorithms2.cpp b/src/cpp/sequence_analysis/hvomc_algorithms2.cpp similarity index 100% rename from src/cpp/hvomc_algorithms2.cpp rename to src/cpp/sequence_analysis/hvomc_algorithms2.cpp diff --git a/src/cpp/markovian_sequences1.cpp b/src/cpp/sequence_analysis/markovian_sequences1.cpp similarity index 100% rename from src/cpp/markovian_sequences1.cpp rename to src/cpp/sequence_analysis/markovian_sequences1.cpp diff --git a/src/cpp/markovian_sequences2.cpp b/src/cpp/sequence_analysis/markovian_sequences2.cpp similarity index 100% rename from src/cpp/markovian_sequences2.cpp rename to src/cpp/sequence_analysis/markovian_sequences2.cpp diff --git a/src/cpp/nhmc_algorithms.cpp b/src/cpp/sequence_analysis/nhmc_algorithms.cpp similarity index 100% rename from src/cpp/nhmc_algorithms.cpp rename to src/cpp/sequence_analysis/nhmc_algorithms.cpp diff --git a/src/cpp/nonhomogeneous_markov.cpp b/src/cpp/sequence_analysis/nonhomogeneous_markov.cpp similarity index 100% rename from src/cpp/nonhomogeneous_markov.cpp rename to src/cpp/sequence_analysis/nonhomogeneous_markov.cpp diff --git a/src/cpp/nonhomogeneous_markov.h b/src/cpp/sequence_analysis/nonhomogeneous_markov.h similarity index 100% rename from src/cpp/nonhomogeneous_markov.h rename to src/cpp/sequence_analysis/nonhomogeneous_markov.h diff --git a/src/cpp/renewal.h b/src/cpp/sequence_analysis/renewal.h similarity index 100% rename from src/cpp/renewal.h rename to src/cpp/sequence_analysis/renewal.h diff --git a/src/cpp/renewal1.cpp b/src/cpp/sequence_analysis/renewal1.cpp similarity index 100% rename from src/cpp/renewal1.cpp rename to src/cpp/sequence_analysis/renewal1.cpp diff --git a/src/cpp/renewal2.cpp b/src/cpp/sequence_analysis/renewal2.cpp similarity index 100% rename from src/cpp/renewal2.cpp rename to src/cpp/sequence_analysis/renewal2.cpp diff --git a/src/cpp/renewal_algorithms.cpp b/src/cpp/sequence_analysis/renewal_algorithms.cpp similarity index 100% rename from src/cpp/renewal_algorithms.cpp rename to src/cpp/sequence_analysis/renewal_algorithms.cpp diff --git a/src/cpp/renewal_distributions.cpp b/src/cpp/sequence_analysis/renewal_distributions.cpp similarity index 100% rename from src/cpp/renewal_distributions.cpp rename to src/cpp/sequence_analysis/renewal_distributions.cpp diff --git a/src/cpp/semi_markov.cpp b/src/cpp/sequence_analysis/semi_markov.cpp similarity index 99% rename from src/cpp/semi_markov.cpp rename to src/cpp/sequence_analysis/semi_markov.cpp index 3ab07f4..48cc403 100644 --- a/src/cpp/semi_markov.cpp +++ b/src/cpp/sequence_analysis/semi_markov.cpp @@ -2245,16 +2245,20 @@ MultiPlotSet* SemiMarkov::get_plotable(const SemiMarkovData *seq) const // computation of the number of plots nb_plot_set = 0; - + + // State process characteristics if ((state_process->index_value) || (characteristics)) { + // smoothed probabilities nb_plot_set++; if (characteristics) { index_length = characteristics->index_value->plot_length_computation(); if (characteristics->index_value->frequency[index_length - 1] < MAX_FREQUENCY) { + // intensities nb_plot_set++; } + // sequence length histogram nb_plot_set++; } } @@ -2333,11 +2337,13 @@ MultiPlotSet* SemiMarkov::get_plotable(const SemiMarkovData *seq) const } } + // additional histogram of sequence lengths if ((characteristics) && (characteristics->nb_run) && (characteristics->nb_occurrence)) { nb_plot_set++; } } + // Observed process characteristics for (i = 0;i < nb_output_process;i++) { if (seq) { switch (seq->type[0]) { @@ -2385,7 +2391,7 @@ MultiPlotSet* SemiMarkov::get_plotable(const SemiMarkovData *seq) const (categorical_process[i]->recurrence_time[j])) { nb_plot_set++; } - else if ((characteristics) && (i < characteristics->nb_value) && + else if ((characteristics) && (j < characteristics->nb_value) && (characteristics->recurrence_time[j]->nb_element > 0)) { nb_plot_set++; } @@ -2398,16 +2404,16 @@ MultiPlotSet* SemiMarkov::get_plotable(const SemiMarkovData *seq) const (categorical_process[i]->sojourn_time[j])) { nb_plot_set++; } - else if ((characteristics) && (i < characteristics->nb_value) && + else if ((characteristics) && (j < characteristics->nb_value) && (characteristics->sojourn_time[j]->nb_element > 0)) { nb_plot_set++; } -/* if ((characteristics) && (j < characteristics->nb_value) && + if ((characteristics) && (j < characteristics->nb_value) && (characteristics->initial_run) && (characteristics->initial_run[j]->nb_element > 0)) { nb_plot_set++; - } */ + } if ((characteristics) && (j < characteristics->nb_value) && (characteristics->final_run[j]->nb_element > 0)) { @@ -2437,6 +2443,7 @@ MultiPlotSet* SemiMarkov::get_plotable(const SemiMarkovData *seq) const } } + // additional histogram of sequence lengths if ((characteristics) && (characteristics->nb_run) && (characteristics->nb_occurrence)) { nb_plot_set++; } diff --git a/src/cpp/semi_markov.h b/src/cpp/sequence_analysis/semi_markov.h similarity index 100% rename from src/cpp/semi_markov.h rename to src/cpp/sequence_analysis/semi_markov.h diff --git a/src/cpp/sequence_characteristics.cpp b/src/cpp/sequence_analysis/sequence_characteristics.cpp similarity index 100% rename from src/cpp/sequence_characteristics.cpp rename to src/cpp/sequence_analysis/sequence_characteristics.cpp diff --git a/src/cpp/sequence_label.cpp b/src/cpp/sequence_analysis/sequence_label.cpp similarity index 100% rename from src/cpp/sequence_label.cpp rename to src/cpp/sequence_analysis/sequence_label.cpp diff --git a/src/cpp/sequence_label.h b/src/cpp/sequence_analysis/sequence_label.h similarity index 100% rename from src/cpp/sequence_label.h rename to src/cpp/sequence_analysis/sequence_label.h diff --git a/src/cpp/sequences.h b/src/cpp/sequence_analysis/sequences.h similarity index 100% rename from src/cpp/sequences.h rename to src/cpp/sequence_analysis/sequences.h diff --git a/src/cpp/sequences1.cpp b/src/cpp/sequence_analysis/sequences1.cpp similarity index 100% rename from src/cpp/sequences1.cpp rename to src/cpp/sequence_analysis/sequences1.cpp diff --git a/src/cpp/sequences2.cpp b/src/cpp/sequence_analysis/sequences2.cpp similarity index 100% rename from src/cpp/sequences2.cpp rename to src/cpp/sequence_analysis/sequences2.cpp diff --git a/src/cpp/sequences3.cpp b/src/cpp/sequence_analysis/sequences3.cpp similarity index 100% rename from src/cpp/sequences3.cpp rename to src/cpp/sequence_analysis/sequences3.cpp diff --git a/src/cpp/smc_algorithms.cpp b/src/cpp/sequence_analysis/smc_algorithms.cpp similarity index 100% rename from src/cpp/smc_algorithms.cpp rename to src/cpp/sequence_analysis/smc_algorithms.cpp diff --git a/src/cpp/smc_distributions1.cpp b/src/cpp/sequence_analysis/smc_distributions1.cpp similarity index 100% rename from src/cpp/smc_distributions1.cpp rename to src/cpp/sequence_analysis/smc_distributions1.cpp diff --git a/src/cpp/smc_distributions2.cpp b/src/cpp/sequence_analysis/smc_distributions2.cpp similarity index 100% rename from src/cpp/smc_distributions2.cpp rename to src/cpp/sequence_analysis/smc_distributions2.cpp diff --git a/src/cpp/time_events.cpp b/src/cpp/sequence_analysis/time_events.cpp similarity index 100% rename from src/cpp/time_events.cpp rename to src/cpp/sequence_analysis/time_events.cpp diff --git a/src/cpp/variable_order_markov.cpp b/src/cpp/sequence_analysis/variable_order_markov.cpp similarity index 100% rename from src/cpp/variable_order_markov.cpp rename to src/cpp/sequence_analysis/variable_order_markov.cpp diff --git a/src/cpp/variable_order_markov.h b/src/cpp/sequence_analysis/variable_order_markov.h similarity index 100% rename from src/cpp/variable_order_markov.h rename to src/cpp/sequence_analysis/variable_order_markov.h diff --git a/src/cpp/vomc_algorithms.cpp b/src/cpp/sequence_analysis/vomc_algorithms.cpp similarity index 100% rename from src/cpp/vomc_algorithms.cpp rename to src/cpp/sequence_analysis/vomc_algorithms.cpp diff --git a/src/cpp/vomc_distributions1.cpp b/src/cpp/sequence_analysis/vomc_distributions1.cpp similarity index 100% rename from src/cpp/vomc_distributions1.cpp rename to src/cpp/sequence_analysis/vomc_distributions1.cpp diff --git a/src/cpp/vomc_distributions2.cpp b/src/cpp/sequence_analysis/vomc_distributions2.cpp similarity index 100% rename from src/cpp/vomc_distributions2.cpp rename to src/cpp/sequence_analysis/vomc_distributions2.cpp diff --git a/src/openalea/sequence_analysis/__init__.py b/src/openalea/sequence_analysis/__init__.py index c9a06e5..38482b4 100644 --- a/src/openalea/sequence_analysis/__init__.py +++ b/src/openalea/sequence_analysis/__init__.py @@ -1,18 +1,10 @@ """Sequence Analysis init file""" -__revision__ = "$Id$" from openalea.stat_tool import * -#import openalea.stat_tool._stat_tool +# import openalea.stat_tool._stat_tool -from openalea.deploy.shared_data import get_shared_data_path from os.path import join as pj -def get_shared_data(file): - import openalea.sequence_analysis - shared_data_path = get_shared_data_path(openalea.sequence_analysis.__path__) - return pj(shared_data_path, file) - - import openalea.stat_tool.interface as interface @@ -21,13 +13,14 @@ def get_shared_data(file): from .compare import * from .time_events import * + # from top_parameters import * # from tops import * from .sequences import * from .hidden_semi_markov import * from .hidden_variable_order_markov import * from .semi_markov import * -from .data_transform import * +from .data_transform import * from .estimate import * from .nonhomogeneous_markov import * @@ -35,3 +28,28 @@ def get_shared_data(file): from .variable_order_markov import * from .distance_matrix import * from .enums_seq import * + +try: + __version__ = version("openalea.sequence_analysis") +except PackageNotFoundError: + # package is not installed + pass + +#if sys.platform.startswith("win"): +# os.add_dll_directory(str(Path(__file__).parent.parent / "lib")) + + +def get_shared_data(file): + import openalea.sequence_analysis + + sadir = files("openalea.sequence_analysis") + if sadir.is_dir(): + datadir = sadir / "data" + with as_file(datadir / file) as f: + return str(f) + +def get_shared_data_path(): + import openalea.sequence_analysis + + datadir = files("openalea.sequence_analysis") + return datadir/'data' diff --git a/src/openalea/sequence_analysis/compare.py b/src/openalea/sequence_analysis/compare.py index 7ceafdf..f943f21 100644 --- a/src/openalea/sequence_analysis/compare.py +++ b/src/openalea/sequence_analysis/compare.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -#-*- coding: utf-8 -*- +# -*- coding: utf-8 -*- """ .. topic:: compare.py summary @@ -12,6 +12,7 @@ :Revision: $Id$ """ + __version__ = "$Id$" @@ -19,22 +20,29 @@ from openalea.stat_tool._stat_tool import I_DEFAULT from openalea.stat_tool._stat_tool import _VectorDistance, _Vectors from openalea.sequence_analysis._sequence_analysis import ( - _SemiMarkov, - _HiddenSemiMarkov, - _VariableOrderMarkov, - _HiddenVariableOrderMarkov + _SemiMarkov, + _HiddenSemiMarkov, + _VariableOrderMarkov, + _HiddenVariableOrderMarkov, ) from openalea.stat_tool.enums import ( - histogram_types, bool_type, - format_type, algorithm_type + histogram_types, + bool_type, + format_type, + algorithm_type, ) from .enums_seq import ( - begin_aligned_map, sequence_alignment_first_arg, output_sequence, - markov_model_comparison_first_arg, indel_cost_map, ms_vomd_smd_nhmd, - markov_model_for_sequences_first_arg, markovian_algorithms, - markov_model_for_sequences_second_arg + begin_aligned_map, + sequence_alignment_first_arg, + output_sequence, + markov_model_comparison_first_arg, + indel_cost_map, + ms_vomd_smd_nhmd, + markov_model_for_sequences_first_arg, + markovian_algorithms, + markov_model_for_sequences_second_arg, ) from openalea.stat_tool import error @@ -46,7 +54,7 @@ def _compare_markovian_sequences(obj, *args, **kargs): .. doctest:: :options: +SKIP - + >>> Compare(mc1, length_histo1, mc2, length_histo2,..., FileName="result") >>> Compare(mc1, mc2,..., nb_seq, length, FileName="result") >>> Compare(mc1, seqm1, mc2, seqm2,..., nb_seq, FileName="result") @@ -70,12 +78,12 @@ def _compare_markovian_sequences(obj, *args, **kargs): filename = kargs.get("Filename", None) - from .enums import ms_vomd_smd_list + from .enums_seq import ms_vomd_smd_list + # Type of arg0 is same as type of obj., so we have the following case # >>> Compare(hsmc1, hsmc2, ,..., nb_seq, FileName="result") if type(args[0]) == type(obj): - - #first_list.append(obj) + # first_list.append(obj) for arg in args: if (isinstance(arg, int)) and nb_seq is None: nb_seq = arg @@ -84,11 +92,10 @@ def _compare_markovian_sequences(obj, *args, **kargs): else: first_list.append(arg) - return obj.divergence_computation_length(first_list, nb_seq, - length, filename) + return obj.divergence_computation_length(first_list, nb_seq, length, filename) # Case where second arguments is Markovian and alternates with obj's type elif type(args[0]) in ms_vomd_smd_list: - #first_list.append(obj) + # first_list.append(obj) for arg in args: if (isinstance(arg, int)) and nb_seq is None: @@ -97,34 +104,35 @@ def _compare_markovian_sequences(obj, *args, **kargs): first_list.append(arg) else: second_list.append(arg) - return obj.divergence_computation_sequences(first_list, second_list, - nb_seq, filename) + return obj.divergence_computation_sequences( + first_list, second_list, nb_seq, filename + ) # Case where second arguments is histogram and then # alternates with obj's type - elif (isinstance(arg[0], histogram_types)): + elif isinstance(arg[0], histogram_types): hlength = [] for arg in args: if type(arg) == type(obj): first_list.append(arg) else: hlength.append(arg) - return obj.divergence_computation_histogram(first_list, hlength, - filename) + return obj.divergence_computation_histogram(first_list, hlength, filename) else: raise Exception("case not handled. ") - - def _compare_sequences(seq, *args, **kargs): """compare function related to sequences""" - #int indel_cost = ADAPTATIVE , algorithm = AGGLOMERATIVE; - #double indel_factor , transposition_factor = TRANSPOSITION_FACTOR; + # int indel_cost = ADAPTATIVE , algorithm = AGGLOMERATIVE; + # double indel_factor , transposition_factor = TRANSPOSITION_FACTOR; - from openalea.sequence_analysis._sequence_analysis import \ - INDEL_FACTOR_1, INDEL_FACTOR_N, TRANSPOSITION_FACTOR + from openalea.sequence_analysis._sequence_analysis import ( + INDEL_FACTOR_1, + INDEL_FACTOR_N, + TRANSPOSITION_FACTOR, + ) error.CheckType([seq], [sequence_alignment_first_arg]) @@ -133,56 +141,67 @@ def _compare_sequences(seq, *args, **kargs): Begin = error.ParseKargs(kargs, "Begin", "Aligned", begin_aligned_map) End = error.ParseKargs(kargs, "End", "Aligned", begin_aligned_map) FileName = kargs.get("FileName", None) - Format = error.ParseKargs(kargs, "Format", 'ASCII', format_type) - AlignmentFormat = error.ParseKargs(kargs, "AlignmentFormat", 'ASCII', - format_type) + Format = error.ParseKargs(kargs, "Format", "ASCII", format_type) + AlignmentFormat = error.ParseKargs(kargs, "AlignmentFormat", "ASCII", format_type) AlignmentFileName = kargs.get("AlignmentFileName", None) - IndelCost = error.ParseKargs(kargs, "IndelCost", "Adaptative", - indel_cost_map) + IndelCost = error.ParseKargs(kargs, "IndelCost", "Adaptative", indel_cost_map) IndelFactor = kargs.get("IndelFactor", INDEL_FACTOR_1) Transposition = error.ParseKargs(kargs, "Transposition", False, bool_type) - TranspositionFactor = error.ParseKargs(kargs, "TranspositionFactor", - TRANSPOSITION_FACTOR) - Algorithm = error.ParseKargs(kargs, "Algorithm", "Agglomerative", - algorithm_type) + TranspositionFactor = error.ParseKargs( + kargs, "TranspositionFactor", TRANSPOSITION_FACTOR + ) + Algorithm = error.ParseKargs(kargs, "Algorithm", "Agglomerative", algorithm_type) # check all int and float cases - error.CheckType([ref_identifier, test_identifier, IndelFactor, - TranspositionFactor, TranspositionFactor], - [int, int, [int, float], [int, float], [int, float]]) - - + error.CheckType( + [ + ref_identifier, + test_identifier, + IndelFactor, + TranspositionFactor, + TranspositionFactor, + ], + [int, int, [int, float], [int, float], [int, float]], + ) # case 2 of AML if len(args) == 1: - if isinstance(args[0], _VectorDistance): + Output = error.ParseKargs( + kargs, "Output", "DistanceMatrix", output_sequence + ) - Output = error.ParseKargs(kargs, "Output", "DistanceMatrix", - output_sequence) - - if Output == 'm': + if Output == "m": if not error.ParseKargs(kargs, IndelFactor): IndelFactor = INDEL_FACTOR_1 - if kargs.get("Algorithm", None): raise ValueError("Algorithm cannot be used in this context") - #todo: othet error case ? - #if ((!transposition_option) && (transposition_factor_option) - #if ((!file_name_option) && (format_option)) - #if ((!alignment_file_name_option) && (alignment_format_option) - - dist_matrix = seq.alignment_vector_distance(args[0], - ref_identifier, test_identifier, Begin, End, - IndelCost, IndelFactor, Transposition, - TranspositionFactor, FileName, Format, - AlignmentFileName, AlignmentFormat) + # todo: othet error case ? + # if ((!transposition_option) && (transposition_factor_option) + # if ((!file_name_option) && (format_option)) + # if ((!alignment_file_name_option) && (alignment_format_option) + + dist_matrix = seq.alignment_vector_distance( + args[0], + ref_identifier, + test_identifier, + Begin, + End, + IndelCost, + IndelFactor, + Transposition, + TranspositionFactor, + FileName, + Format, + AlignmentFileName, + AlignmentFormat, + ) return dist_matrix - elif Output == 's': - #check errors + elif Output == "s": + # check errors # if (ref_sequence_option): - #if (test_sequence_option): + # if (test_sequence_option): # if (transposition_option) # if (transposition_factor_option) # if (format_option) @@ -193,20 +212,26 @@ def _compare_sequences(seq, *args, **kargs): if not error.ParseKargs(kargs, IndelFactor): IndelFactor = INDEL_FACTOR_N + sequence = seq.multiple_alignment( + args[0], Begin, End, IndelCost, IndelFactor, Algorithm, FileName + ) - sequence = seq.multiple_alignment(args[0], Begin, End, - IndelCost, IndelFactor, Algorithm, - FileName) - - if hasattr(seq, 'markovian_sequences'): + if hasattr(seq, "markovian_sequences"): return sequence.markovian_sequences() else: return sequence - else: #case 1 of AML - dist_matrix = seq.alignment(ref_identifier, test_identifier, Begin , - End , FileName , Format , AlignmentFileName, - AlignmentFormat) + else: # case 1 of AML + dist_matrix = seq.alignment( + ref_identifier, + test_identifier, + Begin, + End, + FileName, + Format, + AlignmentFileName, + AlignmentFormat, + ) return dist_matrix @@ -219,8 +244,7 @@ def _compare_markovian_models_for_sequences(obj, *args, **kargs): error.CheckType([obj], [ms_vomd_smd_nhmd]) Filename = kargs.get("Filename", None) - Algorithm = error.ParseKargs(kargs, "Algorithm", 'Forward', - markovian_algorithms) + Algorithm = error.ParseKargs(kargs, "Algorithm", "Forward", markovian_algorithms) markov_list = [] for arg in args: @@ -228,11 +252,11 @@ def _compare_markovian_models_for_sequences(obj, *args, **kargs): markov_list.append(arg) if isinstance(args[0], _HiddenVariableOrderMarkov): - return obj.comparison_hidden_variable_order_markov(markov_list, - Algorithm, Filename) + return obj.comparison_hidden_variable_order_markov( + markov_list, Algorithm, Filename + ) if isinstance(args[0], _HiddenSemiMarkov): - return obj.comparison_hidden_semi_markov(markov_list, - Algorithm, Filename) + return obj.comparison_hidden_semi_markov(markov_list, Algorithm, Filename) elif isinstance(args[0], _VariableOrderMarkov): return obj.comparison_variable_order_markov(markov_list, Filename) # obj should be a sequence @@ -253,7 +277,7 @@ def Compare(arg1, *args, **kargs): .. doctest:: :options: +SKIP - + >>> Compare(histo1, histo2,..., type, FileName="result", Format="ASCII") >>> Compare(vec, vector_distance) @@ -441,30 +465,30 @@ def Compare(arg1, *args, **kargs): p1 = arg1 - # COMPARE 1 if type(p1) in histogram_types: return compare_histo(arg1, *args, **kargs) # COMPARE 2 elif isinstance(p1, _Vectors): return compare_vectors(arg1, *args, **kargs) - #COMPARE 3 - elif type(p1) in sequence_alignment_first_arg and len(args)==0: + # COMPARE 3 + elif type(p1) in sequence_alignment_first_arg and len(args) == 0: return _compare_sequences(arg1, *args, **kargs) - #COMPARE3 bis - elif type(p1) in sequence_alignment_first_arg and \ - isinstance(args[0], _VectorDistance): + # COMPARE3 bis + elif type(p1) in sequence_alignment_first_arg and isinstance( + args[0], _VectorDistance + ): return _compare_sequences(arg1, *args, **kargs) - #Compare 4 - elif type(p1) in markov_model_for_sequences_first_arg and \ - type(args[0]) in markov_model_for_sequences_second_arg: + # Compare 4 + elif ( + type(p1) in markov_model_for_sequences_first_arg + and type(args[0]) in markov_model_for_sequences_second_arg + ): return _compare_markovian_models_for_sequences(arg1, *args, **kargs) - #COMPARE 5 + # COMPARE 5 elif type(p1) in markov_model_comparison_first_arg: return _compare_markovian_sequences(arg1, *args, **kargs) - - raise Exception("Error in Compare. No case corresponding to your command." - "Check your arguments.") - - + raise Exception( + "Error in Compare. No case corresponding to your command.Check your arguments." + ) diff --git a/src/openalea/sequence_analysis/data/README.txt b/src/openalea/sequence_analysis/data/README.txt new file mode 100644 index 0000000..27c95ee --- /dev/null +++ b/src/openalea/sequence_analysis/data/README.txt @@ -0,0 +1 @@ +The directory "data" contains data samples that are used by the tests and the documentation. diff --git a/src/openalea/sequence_analysis/data/abri13.ren b/src/openalea/sequence_analysis/data/abri13.ren new file mode 100644 index 0000000..a58dbc7 --- /dev/null +++ b/src/openalea/sequence_analysis/data/abri13.ren @@ -0,0 +1,11 @@ +16 0 1 +16 1 7 +16 2 14 +16 3 19 +16 4 27 +16 5 19 +16 6 17 +16 7 10 +16 8 7 +16 9 3 +16 10 1 diff --git a/src/openalea/sequence_analysis/data/abricotier_suivi_11.seq b/src/openalea/sequence_analysis/data/abricotier_suivi_11.seq new file mode 100644 index 0000000..db86597 --- /dev/null +++ b/src/openalea/sequence_analysis/data/abricotier_suivi_11.seq @@ -0,0 +1,271 @@ +INDEX_PARAMETER : TIME # 74 values + +# time histogram - sample size: 883 +# mean: 16.6331 variance: 223.623 standard deviation: 14.954 + +1 VARIABLE + +VARIABLE 1 : INT # 41 values + +# value histogram - sample size: 883 +# mean: 14.3986 variance: 61.3624 standard deviation: 7.83342 + +# sequence length histogram - sample size: 127 +# mean: 6.95276 variance: 8.56918 standard deviation: 2.92732 + +# cumulated length: 883 + +0 1 | 3 2 | 7 6 | 10 10 | 13 12 # | 17 12 | 20 12 # (1) + +0 5 | 3 6 | 7 11 | 10 15 | 13 18 # | 17 18 | 20 18 # (2) + +0 4 | 3 9 | 7 10 | 10 20 # | 13 20 | 17 20 # (3) + +0 4 | 3 6 | 7 10 | 10 13 | 13 14 | 17 14 | 20 15 | 24 18 | 28 20 | 49 22 # | 52 22 # (4) + +0 4 | 3 8 | 7 10 | 10 12 | 13 15 | 17 16 # | 20 16 # (5) + +0 4 | 3 7 | 7 8 | 10 15 | 13 15 | 17 15 | 20 17 | 24 18 # | 28 18 # (6) + +0 1 | 3 6 | 7 9 | 10 15 | 13 19 | 17 21 # | 20 21 # (7) + +0 0 | 3 5 | 7 8 | 10 14 | 13 15 | 17 15 | 20 18 # | 24 18 # (8) + +0 0 | 3 3 | 7 7 | 10 14 | 13 16 | 17 19 | 20 22 | 24 22 | 28 26 | 49 30 # | 52 30 # (9) + +0 0 | 3 1 | 7 3 | 10 6 | 13 9 | 17 10 | 20 11 # | 24 11 # (10) + +0 2 | 3 6 | 7 8 | 10 11 | 13 14 | 17 17 | 20 19 # | 24 19 # (11) + +0 2 | 3 4 | 7 8 | 10 14 | 13 17 | 17 17 | 20 19 # | 24 19 # (12) + +0 0 | 3 9 | 7 9 | 10 11 # | 13 11 # (13) + +0 0 | 3 3 | 7 7 | 10 12 | 13 15 # | 17 15 # (14) + +0 3 | 3 4 | 7 8 | 10 11 | 13 11 | 17 12 | 20 16 # | 24 16 # (15) + +0 3 | 3 5 | 7 10 | 10 14 | 13 16 # | 17 16 # (16) + +0 1 | 3 2 | 7 2 | 10 8 | 13 11 | 17 13 | 20 14 # | 24 14 # (17) + +0 3 | 3 4 | 7 8 | 10 15 | 13 19 | 17 19 | 20 21 | 24 23 | 28 24 | 49 30 # | 52 30 # (18) + +0 1 | 3 3 | 7 7 | 10 10 | 13 12 | 17 12 | 20 12 | 24 14 | 28 14 | 49 18 | 52 24 # | 56 24 # (19) + +0 7 | 3 8 | 7 10 | 10 16 | 13 17 # | 17 17 # (20) + +0 2 | 3 2 | 7 3 | 10 11 # | 13 11 # (21) + +0 1 | 3 3 | 7 9 | 10 17 | 13 19 | 17 19 | 20 19 | 24 22 | 28 23 | 49 26 | 52 27 # | 56 27 # (22) + +0 3 | 3 5 | 7 10 | 10 12 | 13 13 # | 17 13 # (23) + +0 5 | 3 9 | 7 16 | 10 17 | 13 17 | 17 21 # | 20 21 # (24) + +0 4 | 3 6 | 7 13 | 10 15 | 13 15 | 17 16 | 20 17 # | 24 17 # (25) + +3 0 | 7 4 | 10 5 | 13 9 # | 17 9 # (26) + +3 4 | 7 8 | 10 11 | 13 13 | 17 16 | 20 16 | 24 19 | 28 21 # (27) + +3 8 | 7 14 | 10 18 | 13 18 | 17 19 # | 20 19 # (28) + +3 0 | 7 3 | 10 5 | 13 12 | 17 14 | 20 15 | 24 16 | 28 17 # (29) + +3 7 | 7 17 | 10 17 | 13 18 | 17 19 | 20 20 | 24 21 # | 28 21 # (30) + +3 3 | 7 7 | 10 12 | 13 13 | 17 13 | 20 13 | 24 14 | 28 18 | 49 19 # | 52 19 # (31) + +3 5 | 7 11 | 10 16 | 13 17 | 17 20 | 20 23 | 24 23 | 28 24 # (32) + +3 3 | 7 9 | 10 15 | 13 16 | 17 17 | 20 17 | 24 19 | 28 19 | 49 26 | 52 27 | 56 29 | 59 34 | 63 36 | 66 36 | 70 37 # | 73 37 # (33) + +3 3 | 7 12 | 10 14 | 13 16 | 17 17 | 20 21 # | 24 21 # (34) + +3 3 | 7 7 | 10 7 | 13 13 # | 17 13 # (35) + +3 3 | 7 7 | 10 10 | 13 15 | 17 17 | 20 19 | 24 19 | 28 21 | 49 23 | 52 24 # | 56 24 # (36) + +3 0 | 7 2 | 10 7 | 13 10 | 17 13 | 20 18 | 24 18 | 28 21 # (37) + +3 2 | 7 10 | 10 11 | 13 14 | 17 14 | 20 17 # | 24 17 # (38) + +3 5 | 7 11 | 10 16 | 13 18 # | 17 18 # (39) + +3 2 | 7 5 | 10 8 # | 13 8 # (40) + +3 0 | 7 4 | 10 7 | 13 12 | 17 13 | 20 18 | 24 20 # | 28 20 # (41) + +3 5 | 7 10 | 10 13 | 13 14 | 17 16 # | 20 16 # (42) + +3 5 | 7 10 | 10 11 | 13 15 | 17 15 | 20 16 | 24 21 | 28 21 | 49 27 # | 52 27 # (43) + +3 3 | 7 7 | 10 12 | 13 12 | 17 14 | 20 14 | 24 15 | 28 15 | 49 23 | 52 23 | 56 24 # | 59 24 # (44) + +3 3 | 7 7 | 10 12 | 13 13 # | 17 13 # (45) + +# 3 0 | 7 0 | 10 0 | +13 1 | 17 5 | 20 8 | 24 13 # | 28 13 # (46) + +3 5 | 7 8 | 10 13 # | 13 13 # (47) + +3 3 | 7 4 | 10 12 | 13 17 | 17 18 | 20 20 | 24 23 | 28 23 | 49 29 | 52 30 # | 56 30 # (48) + +3 4 | 7 11 | 10 13 | 13 15 | 17 15 | 20 15 | 24 16 | 28 18 # (49) + +3 9 | 7 11 | 10 14 | 13 16 # | 17 16 # (50) + +3 8 | 7 14 | 10 21 | 13 21 | 17 22 | 20 22 | 24 23 # | 28 23 # (51) + +3 10 | 7 18 | 10 19 | 13 19 | 17 24 | 20 25 # | 24 25 # (52) + +3 2 | 7 3 | 10 7 | 13 8 | 17 12 | 20 13 | 24 14 # | 28 14 # (53) + +3 6 | 7 14 # | 10 14 # (54) + +3 5 | 7 10 | 10 17 | 13 17 | 17 18 | 20 21 | 24 21 | 28 22 # (55) + +3 4 | 7 9 | 10 12 | 13 16 | 17 17 | 20 19 | 24 20 | 28 20 | 49 28 | 52 29 | 56 30 | 59 32 | 63 34 | 66 37 # | 70 37 # (56) + +3 7 | 7 9 | 10 13 | 13 15 | 17 20 | 20 23 | 24 24 | 28 24 | 49 31 | 52 31 | 56 34 | 59 38 | 63 40 # | 66 40 # (57) + +3 5 | 7 11 | 10 13 | 13 13 | 17 14 | 20 15 # | 24 15 # (58) + +3 5 | 7 9 | 10 11 | 13 16 | 17 16 | 20 18 | 24 20 | 28 20 | 49 28 | 52 29 | 56 31 | 59 32 | 63 33 | 66 37 | 70 39 # (59) + +3 4 | 7 7 | 10 13 # | 13 13 # (60) + +3 4 | 7 7 | 10 12 | 13 18 | 17 18 | 20 18 | 24 21 | 28 23 # (61) + +3 5 | 7 11 | 10 16 | 13 16 | 17 17 # | 20 17 # (62) + +3 7 | 7 12 | 10 13 # | 13 13 # (63) + +3 3 | 7 7 | 10 10 # | 13 10 # (64) + +3 7 | 7 10 | 10 13 | 13 15 | 17 16 # | 20 16 # (65) + +3 5 | 7 12 | 10 15 | 13 15 | 17 16 # | 20 16 # (66) + +3 3 | 7 5 | 10 14 | 13 15 | 17 15 | 20 17 | 24 20 | 28 21 | 49 28 # | 52 28 # (67) + +3 4 | 7 9 | 10 13 | 13 16 | 17 16 | 20 17 # | 24 17 # (68) + +3 1 | 7 3 | 10 6 # | 13 6 # (69) + +3 5 | 7 12 | 10 16 # | 13 16 # (70) + +3 6 | 7 11 | 10 13 # | 13 13 # (71) + +3 4 | 7 12 | 10 15 # | 13 15 # (72) + +3 6 | 7 16 | 10 16 | 13 17 # | 17 17 # (73) + +3 3 | 7 8 | 10 14 | 13 16 | 17 18 | 20 19 | 24 20 | 28 22 # (74) + +3 7 | 7 13 | 10 17 # | 13 17 # (75) + +3 7 | 7 10 | 10 13 | 13 13 | 17 15 | 20 17 | 24 19 | 28 20 # (76) + +3 4 | 7 7 | 10 11 | 13 12 # | 17 12 # (77) + +3 7 | 7 13 | 10 16 | 13 16 | 17 17 # | 20 17 # (78) + +3 11 | 7 12 | 10 17 | 13 19 | 17 19 | 20 19 | 24 19 | 28 21 | 49 24 | 52 26 # | 56 26 # (79) + +3 6 | 7 12 | 10 15 # | 13 15 # (80) + +3 7 | 7 14 # | 10 14 # (81) + +3 9 | 7 11 | 10 15 | 13 17 # | 17 17 # (82) + +3 3 | 7 7 | 10 12 # | 13 12 # (83) + +3 2 | 7 4 | 10 12 | 13 12 | 17 15 | 20 16 | 24 19 | 28 20 # (84) + +3 5 | 7 9 | 10 14 | 13 15 # | 17 15 # (85) + +3 3 | 7 7 | 10 15 | 13 17 | 17 17 | 20 20 # | 24 20 # (86) + +3 3 | 7 7 | 10 15 | 13 15 | 17 16 | 20 17 # | 24 17 # (87) + +3 6 | 7 9 | 10 14 # | 13 14 # (88) + +3 5 | 7 8 | 10 16 | 13 17 # | 17 17 # (89) + +3 3 | 7 10 | 10 14 | 13 17 | 17 17 | 20 18 # | 24 18 # (90) + +3 3 | 7 9 | 10 11 | 13 15 | 17 18 | 20 20 | 24 21 | 28 23 # (91) + +3 8 | 7 11 | 10 15 | 13 17 # | 17 17 # (92) + +3 7 | 7 10 | 10 15 # | 13 15 # (93) + +3 5 | 7 11 | 10 16 # | 13 16 # (94) + +3 5 | 7 11 | 10 12 | 13 16 | 17 19 | 20 20 | 24 21 | 28 21 | 49 25 # | 52 25 # (95) + +3 4 | 7 13 | 10 16 | 13 17 | 17 22 | 20 22 | 24 22 | 28 22 | 49 29 | 52 31 | 56 33 | 59 36 | 63 37 | 66 38 # | 70 38 # (96) + +3 7 | 7 13 | 10 15 # | 13 15 # (97) + +3 7 | 7 13 | 10 16 # | 13 16 # (98) + +3 5 | 7 12 | 10 13 | 13 17 # | 17 17 # (99) + +3 7 | 7 14 | 10 16 # | 13 16 # (100) + +3 5 | 7 8 | 10 14 # | 13 14 # (101) + +3 4 | 7 9 | 10 11 # | 13 11 # (102) + +3 5 | 7 8 | 10 12 # | 13 12 # (103) + +3 8 | 7 10 | 10 16 # | 13 16 # (104) + +3 7 | 7 9 | 10 15 # | 13 15 # (105) + +3 8 | 7 12 | 10 15 | 13 17 # | 17 17 # (106) + +3 6 | 7 11 | 10 14 # | 13 14 # (107) + +3 8 | 7 12 | 10 18 | 13 20 | 17 22 # | 20 22 # (108) + +3 2 | 7 7 | 10 8 | 13 9 # | 17 9 # (109) + +3 3 | 7 9 | 10 11 # | 13 11 # (110) + +3 3 | 7 10 | 10 11 | 13 13 | 17 15 | 20 16 | 24 18 | 28 18 | 49 26 | 52 27 # | 56 27 # (111) + +3 4 | 7 8 | 10 14 # | 13 14 # (112) + +3 3 | 7 6 | 10 11 # | 13 11 # (113) + +3 6 | 7 12 | 10 15 | 13 16 | 17 18 # | 20 18 # (114) + +3 5 | 7 10 | 10 15 | 13 16 | 17 19 | 20 20 | 24 20 | 28 20 | 49 29 | 52 29 | 56 30 # | 59 30 # (115) + +3 3 | 7 7 | 10 14 | 13 15 | 17 17 | 20 19 | 24 19 | 28 19 | 49 30 # | 52 30 # (116) + +3 5 | 7 10 | 10 11 | 13 13 # | 17 13 # (117) + +3 2 | 7 4 | 10 6 | 13 9 | 17 10 # | 20 10 # (118) + +3 4 | 7 9 | 10 15 # | 13 15 # (119) + +3 8 | 7 15 | 10 16 | 13 17 | 17 19 | 20 20 | 24 23 | 28 23 | 49 30 | 52 30 | 56 32 | 59 33 # | 63 33 # (120) + +3 6 | 7 12 | 10 13 | 13 14 | 17 18 # | 20 18 # (121) + +3 1 | 7 4 | 10 6 | 13 9 # | 17 9 # (122) + +3 4 | 7 8 | 10 14 | 13 16 | 17 18 | 20 21 | 24 21 | 28 22 | 49 33 | 52 35 | 56 36 | 59 38 | 63 39 # | 66 39 # (123) + +3 0 | 7 2 | 10 5 | 13 7 | 17 9 | 20 13 | 24 13 | 28 15 | 49 21 # | 52 21 # (124) + +3 6 | 7 14 | 10 19 | 13 20 | 17 22 # | 20 22 # (125) + +3 8 | 7 15 | 10 19 | 13 24 # | 17 24 # (126) + +3 9 | 7 14 | 10 15 | 13 23 # | 17 23 # (127) diff --git a/src/openalea/sequence_analysis/data/belren1.hsc b/src/openalea/sequence_analysis/data/belren1.hsc new file mode 100644 index 0000000..a83e13c --- /dev/null +++ b/src/openalea/sequence_analysis/data/belren1.hsc @@ -0,0 +1,89 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 6 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.1 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/belren1.seq b/src/openalea/sequence_analysis/data/belren1.seq new file mode 100644 index 0000000..dbd8b81 --- /dev/null +++ b/src/openalea/sequence_analysis/data/belren1.seq @@ -0,0 +1,77 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1343 +# mean: 1.30231 variance: 2.66115 standard deviation: 1.6313 + +# | value histogram +# 0 716 latent bud +# 1 153 short shoot +# 2 106 long shoot +# 3 88 fruiting shoot +# 4 280 immediate shoot + +# sequence length histogram - size of the sample: 15 +# mean: 89.5333 variance: 19.4095 standard deviation: 4.40562 + +# cumulative length: 1343 + +2 2 2 2 1 1 1 0 0 0 1 1 1 3 3 1 1 0 1 1 1 0 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 \ +0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 2 0 0 0 0 1 0 0 0 0 0 0 \ +0 0 0 1 0 0 0 0 0 + +1 1 1 0 1 3 0 1 1 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 2 1 2 1 2 2 0 2 1 0 2 1 1 1 1 1 0 1 0 2 0 1 2 0 0 0 0 0 0 \ +0 0 + +0 0 0 0 0 0 0 0 0 1 0 1 2 0 2 2 0 1 1 0 0 0 0 0 0 0 0 0 3 3 0 0 4 4 4 4 4 4 4 0 0 \ +0 4 4 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 1 0 0 2 0 0 0 1 0 0 2 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 + +0 1 2 0 2 1 0 2 0 0 0 3 3 3 3 3 3 3 3 3 1 3 4 3 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 0 \ +4 4 4 4 4 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 0 2 2 0 0 2 2 0 2 0 0 0 0 0 2 \ +0 0 0 0 0 0 0 0 0 0 + +2 2 2 3 3 3 3 3 0 1 0 0 1 1 3 3 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 0 0 4 4 2 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 2 2 2 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 2 2 2 1 1 1 1 1 1 1 3 0 3 1 0 3 0 0 0 3 4 4 4 4 4 0 4 0 4 4 4 4 4 4 4 4 4 4 0 0 \ +4 4 4 4 0 4 4 4 4 4 0 4 0 0 4 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 2 0 2 0 2 2 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 1 3 1 3 0 3 3 1 3 3 3 3 3 0 3 1 3 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 1 2 0 0 0 0 2 0 1 2 0 1 0 0 2 0 1 0 0 2 0 0 1 0 0 0 0 1 0 1 0 0 0 0 \ +0 0 0 0 + +0 0 0 0 1 2 2 0 1 1 2 1 1 0 1 3 1 1 1 3 3 3 3 0 1 1 1 3 1 4 1 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 4 0 0 4 0 4 0 0 2 0 0 0 0 0 0 0 0 2 \ +0 0 2 0 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 0 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 1 1 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 0 4 0 0 \ +0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 + +4 4 0 2 2 1 2 0 1 3 0 1 3 0 3 0 3 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 0 4 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 + +0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 3 0 3 0 3 4 4 4 4 4 1 4 4 4 4 4 4 1 4 4 4 0 \ +0 4 3 4 0 3 4 4 4 4 1 1 0 0 0 2 0 4 1 4 4 1 0 1 0 0 0 0 0 0 2 2 2 2 2 0 0 0 0 2 0 \ +0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 1 1 1 1 1 1 1 2 3 2 3 1 1 3 2 4 4 1 1 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 4 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 + +0 0 0 1 1 2 1 1 1 1 1 3 0 2 1 0 3 3 1 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 \ +0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 1 1 1 1 1 2 0 1 3 1 1 3 0 3 1 1 1 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 0 0 3 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 0 0 4 2 2 2 2 0 0 0 0 2 0 0 2 0 2 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 2 1 1 1 0 2 0 0 1 0 1 0 2 3 1 0 3 0 3 4 4 0 4 4 4 4 4 4 4 4 4 0 4 4 0 \ +4 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/cafe_ortho1.seq b/src/openalea/sequence_analysis/data/cafe_ortho1.seq new file mode 100644 index 0000000..3886a07 --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho1.seq @@ -0,0 +1,200 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 8) + +# value histogram - sample size: 5976 +# mean: 4.15914 variance: 2.82672 standard deviation: 1.68129 + +# | value histogram +# 0 0 +# 1 367 +# 2 873 +# 3 984 +# 4 884 +# 5 1279 +# 6 1265 +# 7 323 +# 8 1 + +# sequence length histogram - sample size: 36 +# mean: 166 variance: 144 standard deviation: 12 + +# cumulative length: 5976 + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (1) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (2) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (3) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 # (4) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (5) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (6) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (7) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (8) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (9) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (10) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 # (11) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (12) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (13) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 # (14) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (15) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (16) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (17) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (18) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (19) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 # (20) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (21) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (22) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (23) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (24) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 # (25) + +1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (26) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 # (27) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (28) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (29) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (30) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (31) + +1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (32) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 # (33) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (34) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (35) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (36) diff --git a/src/openalea/sequence_analysis/data/cafe_ortho2.seq b/src/openalea/sequence_analysis/data/cafe_ortho2.seq new file mode 100644 index 0000000..b4a812e --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho2.seq @@ -0,0 +1,192 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 8) + +# value histogram - sample size: 5712 +# mean: 4.42367 variance: 3.0826 standard deviation: 1.75573 + +# | value histogram +# 0 0 +# 1 293 +# 2 839 +# 3 677 +# 4 752 +# 5 1260 +# 6 1317 +# 7 536 +# 8 38 + +# sequence length histogram - sample size: 34 +# mean: 168 variance: 0 standard deviation: 0 + +# cumulative length: 5712 + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (1) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (2) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (3) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (4) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (5) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 # (6) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (7) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (8) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 \ +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 # (9) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (10) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (11) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (12) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (13) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (14) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (15) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (16) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (17) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (18) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (19) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (20) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (21) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (22) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (23) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (24) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 # (25) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 # (26) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (27) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 # (28) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (29) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (30) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (31) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (32) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (33) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (34) diff --git a/src/openalea/sequence_analysis/data/cafe_ortho3.seq b/src/openalea/sequence_analysis/data/cafe_ortho3.seq new file mode 100644 index 0000000..1c30bc7 --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho3.seq @@ -0,0 +1,150 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 7) + +# value histogram - sample size: 4313 +# mean: 4.00278 variance: 2.5691 standard deviation: 1.60284 + +# | value histogram +# 0 0 +# 1 300 +# 2 643 +# 3 678 +# 4 806 +# 5 1032 +# 6 718 +# 7 136 + +# sequence length histogram - sample size: 26 +# mean: 165.885 variance: 116.346 standard deviation: 10.7864 + +# cumulative length: 4313 + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (1) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (2) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (3) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (4) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 # (5) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 # (6) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (7) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (8) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (9) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (10) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 # (11) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (12) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (13) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 # (14) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (15) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 # (16) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (17) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (18) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (19) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (20) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (21) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (22) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (23) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (24) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (25) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (26) diff --git a/src/openalea/sequence_analysis/data/cafe_ortho4.seq b/src/openalea/sequence_analysis/data/cafe_ortho4.seq new file mode 100644 index 0000000..1cc21e2 --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho4.seq @@ -0,0 +1,149 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 7) + +# value histogram - sample size: 4257 +# mean: 4.21917 variance: 2.9005 standard deviation: 1.70308 + +# | value histogram +# 0 0 +# 1 261 +# 2 647 +# 3 556 +# 4 665 +# 5 997 +# 6 824 +# 7 307 + +# sequence length histogram - sample size: 26 +# mean: 163.731 variance: 473.885 standard deviation: 21.7689 + +# cumulative length: 4257 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 # (1) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (2) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (3) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (4) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (5) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (6) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (7) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (8) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (9) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (10) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (11) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (12) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (13) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (14) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (15) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (16) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (17) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (18) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (19) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (20) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (21) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (22) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (23) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (24) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 # (25) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (26) diff --git a/src/openalea/sequence_analysis/data/cafe_ortho5.seq b/src/openalea/sequence_analysis/data/cafe_ortho5.seq new file mode 100644 index 0000000..a8f2634 --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho5.seq @@ -0,0 +1,192 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 8) + +# value histogram - sample size: 5712 +# mean: 4.20816 variance: 2.69156 standard deviation: 1.6406 + +# | value histogram +# 0 0 +# 1 325 +# 2 743 +# 3 875 +# 4 1036 +# 5 1296 +# 6 1096 +# 7 327 +# 8 14 + +# sequence length histogram - sample size: 34 +# mean: 168 variance: 0 standard deviation: 0 + +# cumulative length: 5712 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (1) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (2) + +1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (3) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 # (4) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (5) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 # (6) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (7) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (8) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (9) + +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 # (10) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 # (11) + +1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 # (12) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (13) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 # (14) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (15) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (16) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (17) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (18) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (19) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (20) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (21) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (22) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 # (23) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (24) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (25) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 # (26) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 # (27) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (28) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (29) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (30) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (31) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (32) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (33) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 # (34) diff --git a/src/openalea/sequence_analysis/data/cafe_ortho6.seq b/src/openalea/sequence_analysis/data/cafe_ortho6.seq new file mode 100644 index 0000000..5523324 --- /dev/null +++ b/src/openalea/sequence_analysis/data/cafe_ortho6.seq @@ -0,0 +1,242 @@ +1 VARIABLE + +VARIABLE 1 : INT # (minimum value: 1, maximum value: 8) + +# value histogram - sample size: 7392 +# mean: 4.42411 variance: 2.92672 standard deviation: 1.71077 + +# | value histogram +# 0 0 +# 1 371 +# 2 955 +# 3 1010 +# 4 980 +# 5 1690 +# 6 1694 +# 7 678 +# 8 14 + +# sequence length histogram - sample size: 44 +# mean: 168 variance: 0 standard deviation: 0 + +# cumulative length: 7392 + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (1) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (2) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (3) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 # (4) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (5) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (6) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (7) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (8) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 # (9) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (10) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 # (11) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 # (12) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 # (13) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (14) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (15) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (16) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 # (17) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (18) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (19) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (20) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (21) + +1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (22) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 # (23) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (24) + +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (25) + +1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (26) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (27) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (28) + +1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 # (29) + +1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (30) + +1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (31) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 # (32) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 # (33) + +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 # (34) + +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 # (35) + +1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (36) + +1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 # (37) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (38) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 # (39) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 # (40) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 # (41) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 \ +4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \ +7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 # (42) + +1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (43) + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 \ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \ +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 # (44) diff --git a/src/openalea/sequence_analysis/data/chene_sessile_15pa.seq b/src/openalea/sequence_analysis/data/chene_sessile_15pa.seq new file mode 100644 index 0000000..ebd14db --- /dev/null +++ b/src/openalea/sequence_analysis/data/chene_sessile_15pa.seq @@ -0,0 +1,117 @@ +######################################################################### +# +# Successive annual shoots of sessile oaks (observed in Meuse, France). +# +######################################################################### + + +6 VARIABLES + +VARIABLE 1 : STATE # year of growth (95, 96, 97) + +VARIABLE 2 : STATE # annual shoot length in cm + +VARIABLE 3 : STATE # shoot diameter in tenths of mm + +VARIABLE 4 : STATE # number of growth cycles + +VARIABLE 5 : STATE # number of metamers + +VARIABLE 6 : STATE # number of branches + +# sequence length histogram - sample size: 46 +# mean: 3 variance: 0 standard deviation: 0 + +# cumulative length: 138 + +95 110 219 2 52 14 | 96 17 119 2 24 9 | 97 57 101 2 33 1 # (1) + +95 88 214 2 50 12 | 96 35 127 1 18 8 | 97 77 92 2 40 0 # (2) + +95 59 136 2 35 6 | 96 14 93 1 17 10 | 97 68 86 2 40 2 # (3) + +95 79 180 2 55 7 | 96 26 132 1 18 8 | 97 59 129 2 30 0 # (4) + +95 65 210 2 40 6 | 96 31 123 1 33 11 | 97 69 104 2 36 1 # (5) + +95 35 127 2 28 6 | 96 18 106 2 27 5 | 97 60 103 2 33 1 # (6) + +95 23 145 2 16 8 | 96 24 103 1 9 3 | 97 71 89 2 54 0 # (7) + +95 45 113 2 33 10 | 96 8 85 1 12 2 | 97 35 57 1 22 0 # (8) + +95 83 157 2 35 7 | 96 4 95 1 10 3 | 97 37 68 2 29 0 # (9) + +95 33 109 2 24 6 | 96 12 66 1 17 4 | 97 53 63 2 40 1 # (10) + +95 63 112 2 52 14 | 96 25 60 1 19 8 | 97 6 39 1 12 0 # (11) + +95 55 124 3 27 8 | 96 23 70 1 25 2 | 97 20 64 1 21 0 # (12) + +95 70 125 2 42 14 | 96 26 102 1 17 7 | 97 50 71 2 33 0 # (13) + +95 79 119 2 52 9 | 96 26 73 1 22 6 | 97 9 41 1 13 0 # (14) + +95 69 142 2 33 12 | 96 26 85 1 22 8 | 97 21 51 1 14 0 # (15) + +95 50 146 2 40 8 | 96 22 95 1 22 6 | 97 26 51 1 20 0 # (16) + +95 81 145 2 53 19 | 96 15 61 1 23 3 | 97 19 53 2 21 0 # (17) + +95 74 160 2 45 8 | 96 38 102 1 22 5 | 97 34 68 1 33 0 # (18) + +95 59 177 2 35 1 | 96 29 140 1 22 5 | 97 78 101 2 53 2 # (19) + +95 49 172 2 37 9 | 96 50 144 3 42 9 | 97 62 70 2 50 2 # (20) + +95 14 109 1 16 1 | 96 33 100 2 21 5 | 97 57 79 2 45 0 # (21) + +95 70 142 2 61 12 | 96 26 89 1 29 5 | 97 28 79 1 32 0 # (22) + +95 66 129 2 58 7 | 96 38 90 1 29 5 | 97 24 43 1 21 0 # (23) + +95 19 90 2 22 3 | 96 6 84 1 8 1 | 97 63 71 2 37 2 # (24) + +95 56 116 2 47 8 | 96 16 76 1 20 5 | 97 21 45 1 19 0 # (25) + +95 73 169 2 35 11 | 96 27 126 1 16 9 | 97 35 93 1 16 0 # (26) + +95 53 141 2 29 17 | 96 33 93 1 20 4 | 97 24 60 1 23 0 # (27) + +95 51 132 3 51 14 | 96 28 117 1 23 4 | 97 90 122 2 53 7 # (28) + +95 58 152 4 50 15 | 96 15 96 1 11 2 | 97 75 86 2 42 2 # (29) + +95 39 138 2 37 9 | 96 35 106 1 22 7 | 97 38 85 1 26 0 # (30) + +95 37 163 2 28 8 | 96 29 116 2 38 6 | 97 58 102 2 44 3 # (31) + +95 70 136 2 54 10 | 96 25 75 1 23 4 | 97 9 50 1 15 0 # (32) + +95 42 135 2 33 6 | 96 23 111 1 17 2 | 97 79 96 2 37 2 # (33) + +95 63 131 2 40 15 | 96 29 79 1 17 4 | 97 23 86 2 20 2 # (34) + +95 34 130 2 27 6 | 96 12 102 1 13 4 | 97 57 85 2 39 1 # (35) + +95 72 176 2 41 5 | 96 30 99 2 31 7 | 97 28 70 1 19 0 # (36) + +95 61 119 2 45 5 | 96 30 116 1 23 7 | 97 40 87 1 38 0 # (37) + +95 95 210 2 61 17 | 96 20 120 1 18 5 | 97 66 99 2 46 0 # (38) + +95 54 150 2 38 9 | 96 36 94 1 23 8 | 97 31 63 2 24 0 # (39) + +95 93 134 3 59 14 | 96 16 90 1 15 2 | 97 38 69 2 29 0 # (40) + +95 72 190 2 51 15 | 96 33 116 2 27 7 | 97 76 85 2 50 1 # (41) + +95 38 95 2 27 12 | 96 11 73 1 11 3 | 97 42 61 2 24 0 # (42) + +95 20 138 2 24 4 | 96 19 113 1 15 3 | 97 42 94 1 33 0 # (43) + +95 65 175 2 63 12 | 96 32 122 1 27 8 | 97 34 81 1 25 0 # (44) + +95 58 145 2 42 9 | 96 19 95 1 18 3 | 97 85 86 3 57 2 # (45) + +95 46 155 2 28 6 | 96 24 107 2 26 9 | 97 31 70 2 21 0 # (46) diff --git a/src/openalea/sequence_analysis/data/compound1.cd b/src/openalea/sequence_analysis/data/compound1.cd new file mode 100644 index 0000000..e05a45e --- /dev/null +++ b/src/openalea/sequence_analysis/data/compound1.cd @@ -0,0 +1,7 @@ +COMPOUND_DISTRIBUTION + +SUM_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 2 PROBABILITY : 0.5 + +ELEMENTARY_DISTRIBUTION +BINOMIAL INF_BOUND : 2 SUP_BOUND : 5 PROBABILITY : 0.5 \ No newline at end of file diff --git a/src/openalea/sequence_analysis/data/dupreziana21.hc b/src/openalea/sequence_analysis/data/dupreziana21.hc new file mode 100644 index 0000000..c996fb3 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana21.hc @@ -0,0 +1,44 @@ +HIDDEN_MARKOV_CHAIN + +3 STATES + +INITIAL_PROBABILITIES +0.8 0.1 0.1 + +TRANSITION_PROBABILITIES # memory +# 0.352885 0.547115 0.1 0 non-terminal +# 0.381192 0.423546 0.195262 0 0 non-terminal +0.496324 0.403676 0.1 0 0 0 # terminal +0.367958 0.397887 0.234155 1 0 0 # terminal +0.1 0.459574 0.440426 2 0 0 # terminal +0.256309 0.643691 0.1 1 0 # terminal +0.680294 0.219706 0.1 2 0 # terminal +# 0.7594 0.1406 0.1 1 non-terminal +0.782464 0.117536 0.1 0 1 # terminal +0.625846 0.274154 0.1 1 1 # terminal +0.72 0.18 0.1 2 1 # terminal +0.8 0.1 0.1 2 # terminal + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.4 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.3 + +# OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.4 +OUTPUT 2 : 0.3 + +# OUTPUT 0 : 0.4 +# OUTPUT 1 : 0.6 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.4 diff --git a/src/openalea/sequence_analysis/data/dupreziana_20a2.seq b/src/openalea/sequence_analysis/data/dupreziana_20a2.seq new file mode 100644 index 0000000..3de6321 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana_20a2.seq @@ -0,0 +1,112 @@ +# 2 A2 par arbres au niveau 20 EN du sommet des troncs> +# UNE SEULE PHYLLOTAXIE : OPPOSEE DECUSSE + +1 VARIABLE + +VARIABLE 1 : INT # nombre de rameaux portes : 0, 1 ou 2 + + +0 1 0 1 0 1 0 2 0 0 2 0 1 0 0 2 0 0 0 0 1 0 0 2 0 0 1 0 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 + +0 1 0 0 2 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 +0 2 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 + +0 1 0 1 0 1 0 0 1 +0 1 0 0 0 1 0 0 0 0 + +0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 +0 1 0 1 0 0 0 0 1 0 1 1 0 + +0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 +0 1 0 1 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 + +0 1 0 1 0 1 0 0 1 0 0 2 0 1 0 1 0 1 1 0 0 0 0 0 +0 1 0 2 0 1 1 0 0 0 0 2 0 0 1 0 1 0 0 0 0 0 0 0 0 + +0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 +0 1 0 0 1 1 0 0 + +0 2 0 0 2 0 0 2 0 0 1 0 1 0 0 1 0 1 1 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 0 1 0 1 0 + +0 1 0 1 0 1 1 0 1 0 0 2 0 0 1 0 0 1 0 0 1 0 0 2 0 0 1 0 0 0 0 0 +0 1 0 1 0 1 1 0 1 0 1 2 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 + +0 2 0 1 2 0 0 2 0 0 2 0 2 0 0 2 0 0 2 0 0 0 0 0 0 +0 2 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 0 0 1 0 0 +0 1 0 1 0 0 0 0 1 0 0 0 0 + +0 1 0 1 0 1 0 0 1 0 0 0 +0 1 0 1 0 1 0 0 + +0 1 0 1 0 1 0 0 2 0 0 0 0 0 2 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 1 0 1 0 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 1 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 1 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 0 0 0 + +0 1 0 0 0 1 0 0 2 0 0 2 0 0 1 1 0 0 0 +0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 2 0 0 0 0 0 + +0 1 0 0 0 1 0 0 2 0 0 2 0 0 1 0 0 2 0 0 1 0 0 0 0 0 +0 1 0 1 0 1 0 0 1 0 0 1 0 0 2 0 0 2 0 0 1 0 0 0 0 0 0 + +0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 + +0 2 0 0 0 1 0 0 2 0 0 1 0 0 2 0 0 2 0 0 0 0 0 0 +0 1 0 1 0 1 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 + +0 1 0 1 0 1 0 1 0 1 0 2 0 1 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 1 0 1 0 0 2 0 0 2 0 1 0 1 1 0 0 0 0 0 0 0 + +0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 2 0 2 0 0 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 0 0 0 0 + +0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 0 1 0 0 2 0 0 0 0 0 0 + +0 1 0 1 0 1 0 0 1 0 +0 1 0 1 0 1 0 0 2 0 0 + +0 1 0 1 0 1 0 0 2 0 0 1 0 1 0 1 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 + +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 + +0 0 0 1 0 1 0 0 0 0 +0 1 0 1 0 1 0 1 0 + +0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 +0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 + +0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 +0 0 0 1 0 0 0 0 2 0 0 1 0 0 2 0 0 2 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 + +0 1 0 0 0 +0 1 0 1 0 1 0 0 0 + +0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 1 0 0 2 0 0 2 0 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 +0 1 0 1 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 0 + +0 1 0 1 0 1 0 0 2 0 0 2 0 0 0 0 +0 1 0 1 0 1 0 0 1 0 0 2 0 0 0 0 0 + +0 2 0 0 2 0 0 2 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 +0 1 0 1 0 1 0 1 1 0 1 0 0 2 0 0 1 1 1 0 1 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/dupreziana_40a2.seq b/src/openalea/sequence_analysis/data/dupreziana_40a2.seq new file mode 100644 index 0000000..5501003 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana_40a2.seq @@ -0,0 +1,319 @@ +# cupressus dupreziana eleves en pepiniere au ruscas , ages de trois ans , mesures en juin 96 +# 2 a2 par arbre au niveau 40 EN du sommet +# 2 phyllotaxies :opposee decussee puis verticille de trois (pas observable sur tout les rameaux) + +2 VARIABLES + +VARIABLE 1 : INT # phyllotaxie par 2 ou par trois 3 +VARIABLE 2 : INT # nombre de rameaux portes ( 0 1 2 ou 3 ) + + +# arbre 54 +# p40a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 52 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 51 +# p38a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p39a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 50 +# p41a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 1 +# p39a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p40a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 7 +# p41a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 2 | 2 0 | 2 2 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 2 | 2 1 | 2 1 | 2 2 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre 12 +# p40a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 + +# arbre11 +# p39a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 10 +# p41a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 + +# arbre18 +# p39a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 1 | 2 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 17 +# p39a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre15 +# p41a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre14 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 20 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 + +# arbre 21 +# p40a2 +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre22 +# p43a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p43a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 + +# arbre23 +# p39a2 +2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 25 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre26 +# p40a2 +2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p42a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre27 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre 29 +# p40a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 +# p40a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 31 +# p38a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre36 +# p38a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre37 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 3 0 | 3 0 + +# arbre38 +# p39a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 +# p39a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre 40 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p42a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre 41 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 + +# arbre 42 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre 43 +# p39a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 45 +# p39a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 47 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 48 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 55 +# p39a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre 56 +# p39a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 3 2 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 57 +# p40a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p41a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 diff --git a/src/openalea/sequence_analysis/data/dupreziana_60a2.seq b/src/openalea/sequence_analysis/data/dupreziana_60a2.seq new file mode 100644 index 0000000..5ba80f7 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana_60a2.seq @@ -0,0 +1,408 @@ +# cupressus dupreziana agees de trois ans eleves en pepiniere au ruscas +# mesures en juin 96 +# 2 a2 par arbre au niveau 60 EN du sommet du tronc +# 2 phyllotaxies : opposee decussee puis verticillee par trois +# ( le verticille de trois feuilles ne s'observe pas sur tout les a2 ) + +2 VARIABLES + +VARIABLE 1 : INT # phyllotaxie par 2 ou 3 +VARIABLE 2 : INT # nombre de rameaux portes + +# arbre 54 +# P60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 + +# arbre 52 +# p61a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p63a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 51 +# p63a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p63a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 50 +# p59a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 + +# arbre 1 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 3 2 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 7 +# p57a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p57a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre12 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 + +# arbre 11 +# p62a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 +# p63a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 10 +# p61a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 +# p62a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 18 +# p60a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 + +# arbre 17 +# p59a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 0 +# p59a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre 15 +# p60a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre 14 +# p60a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 20 +# p60a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 21 +# p61a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 22 +# p61a2 +2 0 | 2 2 | 2 0 | 2 2 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 +# p62a2 +2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 23 +# p59a2 +2 0 | 2 2 | 2 1 | 2 0 | 2 2 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p59a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 25 +# p60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 26 +# p58a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 +# p58a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 27 +# p61a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 29 +# p59a2 +2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 31 +# p61a2 +2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 +# p63a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 \ +3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 + +# arbre 36 +# p60a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 +# p62 +2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 1 + +# arbre 37 +# p59a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre38 +# p60a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre40 +# p61a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 +# p62a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre 41 +# p53a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 +# p53a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 + +# arbre 42 +# p60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p60a2 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre 43 +# p61a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 2 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 + +# arbre 45 +# p61a2 +2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 3 0 | 3 0 +# p61a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 + +# arbre 47 +# p61a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 +# p61a2 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 48 +# p61a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 3 0 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 + +# arbre 55 +# p59a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 56 +# p60a2 +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 +# p61a2 +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 3 0 | 3 0 | 3 0 + +#arbre 57 +# p59a2 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p59a2 +2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 diff --git a/src/openalea/sequence_analysis/data/dupreziana_80a2.seq b/src/openalea/sequence_analysis/data/dupreziana_80a2.seq new file mode 100644 index 0000000..c8dc5a0 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana_80a2.seq @@ -0,0 +1,314 @@ +# cupressus dupreziana eleves en pepiniere au ruscas , ages de trois ans , mesures en juin 96 +# 2 a3 par arbre au niveau 80 EN du sommet +# 2 phyllotaxies :opposee decussee puis verticille de trois (pas observable sur tout les rameaux) + +2 VARIABLES + +VARIABLE 1 : INT # phyllotaxie par 2 ou par 3 +VARIABLE 2 : INT # nombre de rameaux portes + + +# arbre 54 +# P80a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# P82a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 80 +# p79a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p79a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 51 +# p81a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p83a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre50 +# p81a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 + +# arbre 1 +# p80a3 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 \ +3 0 + +# arbre 7 +# p77a3 +2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p79a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 12 +# p78a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 11 +# p80 a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p82 a3 +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 + +# arbre 10 +# p79a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 +# p80a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 18 +# p78a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p81 a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 17 +# p81a3 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 15 +# p78a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 14 +# p80a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 + + +# arbre 20 +# p80a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 21 +# p76a3 +2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 +# p80a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 2 + +# arbre22 +# p80a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 23 +# p80a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 25 +# p82a3 +2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 +# p82a3 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 26 +# p79a3 +2 1 | 2 2 | 2 1 | 2 1 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p79a3 +2 0 | 2 1 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 \ +3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 + +# arbre 27 +# p83a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p82a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 29 +# p77a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p78a3 +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 31 +# p81a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 2 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 +# p81a3 +2 0 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 + +# arbre 36 +# p79a3 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 2 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 +# p79a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 \ +2 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 2 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 37 +# p77a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p78 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 + +# arbre 38 +# p79 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 + +# arbre 40 +# p78 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 2 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 2 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 42 +# p81a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 +# p81a3 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre43 +# p80a3 +2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 45 +# p77 +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p79a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 \ +2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 + +# arbre 47 +# p79a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p80a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 + +# arbre 48 +# p79a3 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 +# p81a3 +2 0 | 2 2 | 2 0 | 2 1 | 2 1 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 0 + +# arbre 55 +# p79a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 + +# arbre56 +# p78a3 +2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 +# p80a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 1 \ +2 0 | 2 0 | 2 1 | 2 0 + +# arbre 57 +# p78a3 +2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 2 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 \ +2 0 | 2 0 +# p79a3 +2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 0 | 2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 0 | 2 1 | 2 0 \ +2 1 | 2 0 | 2 1 | 2 0 | 2 0 | 2 0 | 2 0 diff --git a/src/openalea/sequence_analysis/data/dupreziana_a1.seq b/src/openalea/sequence_analysis/data/dupreziana_a1.seq new file mode 100644 index 0000000..98ffa21 --- /dev/null +++ b/src/openalea/sequence_analysis/data/dupreziana_a1.seq @@ -0,0 +1,291 @@ +# Cypres dupreziana de 3 ans, eleves en pepiniere au Ruscas, plantes en 93 +# mesures en juin 96. Fichier contenant les troncs de 33 arbres sans mort d'apex. +# Dans ce fichier, les petits rameaux differes de la base ne sont pas pris en compte. + +2 VARIABLES + +VARIABLE 1 : STATE # phyllotaxie par 4 ou par 3 +VARIABLE 2 : STATE # nombre de rameaux porte (0 a 4 ou 3 fonction de la phyllotaxie) + + +# arbre 54 +4 0 | 4 0 | 4 0 | 4 0 | 4 2 | 4 1 | 4 0 | 4 0 | 4 3 | 4 1 | 4 1 | 4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 | 4 1 \ +4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 2 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 \ +3 2 | 3 0 | 3 1 | 3 0 | 3 0 + +# arbre 14 +4 0 | 4 0 | 4 4 | 4 1 | 4 2 | 4 1 | 4 0 | 4 2 | 4 2 | 4 2 | 4 3 | 4 2 | 4 1 | 4 1 | 4 2 | 4 1 | 4 0 | 4 1 \ +4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 1 | 4 1 | 4 1 | 4 0 \ +4 1 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 1 | 4 2 | 4 0 | 4 2 | 4 0 | 4 0 | 4 3 | 4 0 | 4 0 | 4 1 | 4 1 \ +4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 \ +4 0 | 4 1 | 4 0 | 4 2 | 4 1 | 4 1 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 1 | 4 2 | 4 1 | 4 0 | 4 1 | 4 1 \ +4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 0 + +# arbre 15 +4 0 | 4 0 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 3 | 4 1 | 4 0 | 4 0 | 4 2 | 4 2 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 \ +4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 | 4 0 | 4 1 | 4 1 \ +4 1 | 4 1 | 4 1 | 4 2 | 4 1 | 4 0 | 4 2 | 4 1 | 4 1 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 1 | 4 0 | 4 1 \ +4 0 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 0 | 4 2 | 4 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 51 +4 0 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 \ +3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 + +# arbre 50 +4 2 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 2 | 4 2 | 4 1 | 4 2 | 4 1 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 2 \ +4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 2 | 3 2 | 3 1 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 + +# arbre 1 +4 0 | 4 0 | 4 1 | 4 1 | 4 2 | 4 0 | 4 2 | 4 2 | 4 2 | 4 2 | 4 1 | 4 1 | 4 1 | 4 2 | 4 2 | 4 1 | 4 3 | 4 1 \ +4 2 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 2 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 + +# arbre 7 +4 1 | 4 2 | 4 3 | 4 3 | 4 4 | 4 3 | 4 2 | 4 2 | 4 3 | 4 3 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 \ +4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 \ +3 3 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 \ +3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 + +# arbre 12 +4 2 | 4 1 | 4 2 | 4 3 | 4 3 | 4 2 | 4 4 | 4 3 | 4 4 | 4 3 | 4 2 | 4 3 | 4 1 | 4 3 | 4 0 | 4 4 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 1 | 4 2 | 4 2 | 4 2 | 4 2 | 4 2 | 4 0 | 4 0 | 4 3 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 \ +4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 \ +4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 2 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 + +# arbre 11 +4 0 | 4 0 | 4 2 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 | 4 1 | 4 3 | 4 0 | 4 2 | 4 0 | 4 2 | 4 1 | 4 1 \ +4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 + +# arbre 10 +4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 2 | 4 0 | 4 3 | 4 1 | 4 3 | 4 0 | 4 1 | 4 1 | 4 2 | 4 1 | 4 0 \ +4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 0 + +# arbre 18 +4 0 | 4 2 | 4 2 | 4 3 | 4 1 | 4 2 | 4 2 | 4 1 | 4 1 | 4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 \ +4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 \ +4 1 | 4 2 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 1 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 1 \ +4 2 | 4 0 | 4 2 | 4 0 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 \ +4 1 | 4 0 | 4 2 | 4 0 | 4 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 2 | 3 0 + +# arbre 17 +4 1 | 4 1 | 4 3 | 4 0 | 4 4 | 4 0 | 4 2 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 \ +4 0 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 2 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 2 \ +3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 + +# arbre 20 +4 1 | 4 1 | 4 1 | 4 2 | 4 1 | 4 3 | 4 1 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 1 | 4 1 | 4 2 | 4 0 | 4 2 \ +4 1 | 4 2 | 4 0 | 4 0 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 21 +4 0 | 4 0 | 4 1 | 4 1 | 4 2 | 4 2 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 | 4 2 | 4 1 | 4 1 | 4 0 | 4 2 \ +4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 23 +4 2 | 4 3 | 4 4 | 4 4 | 4 3 | 4 3 | 4 2 | 4 3 | 4 2 | 4 3 | 4 2 | 4 2 | 4 2 | 4 1 | 4 2 | 4 0 | 4 2 | 4 0 \ +4 0 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 2 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 \ +4 2 | 4 0 | 4 0 | 4 3 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 \ +4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 \ +4 1 | 4 0 | 4 0 | 4 0 | 4 3 | 4 1 | 4 0 | 4 0 | 4 1 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 \ +4 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 25 +4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 3 | 4 1 | 4 2 | 4 2 | 4 2 | 4 2 | 4 1 | 4 1 | 4 2 | 4 1 | 4 2 | 4 1 | 4 2 \ +4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 3 0 | 3 2 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 26 +4 1 | 4 2 | 4 3 | 4 3 | 4 3 | 4 4 | 4 3 | 4 1 | 4 1 | 4 1 | 4 3 | 4 1 | 4 1 | 4 2 | 4 1 | 4 2 | 4 1 | 4 1 \ +4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 | 4 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 3 | 3 0 | 3 1 | 3 3 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 27 +4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 2 | 4 1 | 4 0 | 4 3 | 4 2 | 4 1 | 4 1 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 \ +4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 3 | 3 0 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 3 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 \ +3 0 | 3 0 + +# arbre 29 +4 0 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 0 \ +4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 | 4 0 | 4 0 | 4 2 | 4 1 | 4 1 | 4 0 \ +4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 31 +4 2 | 4 3 | 4 2 | 4 3 | 4 1 | 4 4 | 4 3 | 4 2 | 4 3 | 4 3 | 4 1 | 4 2 | 4 3 | 4 2 | 4 2 | 4 1 | 4 1 | 4 3 \ +4 1 | 4 1 | 4 2 | 4 1 | 4 1 | 4 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 3 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 2 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 | 3 0 \ +3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 \ +3 0 + +# arbre 36 +4 2 | 4 4 | 4 3 | 4 4 | 4 3 | 4 3 | 4 3 | 4 3 | 4 4 | 4 3 | 4 3 | 4 1 | 4 4 | 4 4 | 4 4 | 4 1 | 4 1 | 4 3 \ +4 3 | 4 2 | 4 2 | 4 2 | 3 0 | 3 3 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 2 | 3 1 | 3 2 | 3 0 | 3 1 | 3 3 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 3 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 \ +3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 37 +4 1 | 4 0 | 4 0 | 4 1 | 4 2 | 4 3 | 4 0 | 4 4 | 4 1 | 4 1 | 4 1 | 4 2 | 4 2 | 4 2 | 4 1 | 4 1 | 4 1 | 4 2 \ +4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 2 | 4 0 | 4 0 \ +4 2 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 \ +3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 38 +4 0 | 4 0 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 | 4 2 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 \ +4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 3 | 4 0 | 4 1 | 4 0 | 4 3 | 4 0 | 4 2 | 4 0 | 4 1 \ +4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 4 0 | 4 2 | 4 1 | 4 0 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 0 | 3 0 + +# arbre 40 +4 1 | 4 2 | 4 3 | 4 3 | 4 2 | 4 1 | 4 2 | 4 0 | 4 1 | 4 3 | 4 0 | 4 2 | 4 0 | 4 3 | 3 1 | 3 2 | 3 0 | 3 2 \ +3 3 | 3 2 | 3 0 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 \ +3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 42 +4 0 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 2 | 4 2 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 0 | 4 3 \ +4 0 | 4 3 | 4 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 \ +3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 3 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 43 +4 0 | 4 1 | 4 2 | 4 2 | 4 2 | 4 2 | 4 1 | 4 1 | 4 1 | 4 2 | 4 2 | 4 2 | 4 3 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 \ +4 0 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 0 | 4 4 | 4 0 \ +4 0 | 4 2 | 4 1 | 4 2 | 4 1 | 4 0 | 4 2 | 4 0 | 4 2 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 1 | 4 1 | 4 2 | 4 0 | 4 0 | 4 2 | 4 0 | 4 0 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 \ +4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 45 +4 0 | 4 2 | 4 1 | 4 1 | 4 3 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 \ +4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 2 | 4 0 | 4 0 \ +4 2 | 4 1 | 4 0 | 4 2 | 3 0 | 3 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 2 | 3 1 | 3 1 | 3 0 | 3 2 \ +3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 2 | 3 0 \ +3 1 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 47 +4 0 | 4 0 | 4 2 | 4 2 | 4 1 | 4 1 | 4 1 | 4 2 | 4 0 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 \ +4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 0 | 4 0 | 4 3 | 4 0 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 \ +4 1 | 4 0 | 4 1 | 4 0 | 4 3 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 \ +4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 0 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 48 +4 2 | 4 4 | 4 4 | 4 4 | 4 2 | 4 2 | 4 4 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 2 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 0 | 4 3 | 4 3 | 4 1 | 4 0 | 4 0 | 4 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 \ +3 1 | 3 1 | 3 0 | 3 2 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 \ +3 0 + +# arbre 52 +4 0 | 4 0 | 4 0 | 4 1 | 4 2 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 2 | 4 0 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 \ +4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 0 | 3 2 | 3 0 \ +3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 55 +4 0 | 4 1 | 4 0 | 4 0 | 4 2 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 2 | 4 0 | 4 0 | 4 1 | 4 1 | 4 0 \ +4 1 | 4 0 | 4 0 | 4 2 | 4 0 | 3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 1 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 1 | 3 2 | 3 0 | 3 1 \ +3 0 | 3 1 | 3 0 | 3 1 | 3 2 | 3 0 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 | 3 0 | 3 0 \ +3 2 | 3 1 | 3 0 | 3 1 | 3 1 | 3 0 | 3 2 | 3 0 | 3 0 | 3 2 | 3 0 | 3 1 | 3 1 | 3 0 | 3 1 | 3 0 | 3 1 | 3 1 \ +3 0 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 56 +4 0 | 4 2 | 4 0 | 4 3 | 4 0 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 1 | 4 3 | 4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 \ +4 0 | 4 1 | 4 0 | 4 0 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 3 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 \ +4 1 | 4 1 | 4 0 | 4 3 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 0 | 4 1 | 4 0 \ +4 3 | 4 0 | 4 1 | 4 0 | 4 1 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 3 1 | 3 0 | 3 0 | 3 1 \ +3 2 | 3 2 | 3 0 | 3 0 | 3 2 | 3 1 | 3 1 | 3 0 | 3 0 | 3 1 | 3 1 | 3 1 | 3 2 | 3 0 | 3 0 | 3 1 | 3 0 | 3 1 \ +3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 1 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 | 3 0 + +# arbre 57 +4 0 | 4 0 | 4 0 | 4 2 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 2 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 \ +4 0 | 4 1 | 4 0 | 4 1 | 4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 2 \ +4 0 | 4 2 | 4 0 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 | 4 1 \ +4 0 | 4 1 | 4 1 | 4 0 | 4 1 | 4 1 | 4 1 | 4 0 | 4 1 | 4 0 | 4 0 | 4 3 | 4 0 | 4 0 | 4 1 | 4 0 | 4 3 | 4 0 \ +4 0 | 4 2 | 4 1 | 4 2 | 4 0 | 4 1 | 4 2 | 4 2 | 4 1 | 4 0 | 4 1 | 4 0 | 4 2 | 4 0 | 4 1 | 4 0 | 4 1 | 4 0 \ +4 1 | 4 0 | 4 0 | 4 0 | 4 0 | 4 0 + diff --git a/src/openalea/sequence_analysis/data/elstar1.hsc b/src/openalea/sequence_analysis/data/elstar1.hsc new file mode 100644 index 0000000..52e09b4 --- /dev/null +++ b/src/openalea/sequence_analysis/data/elstar1.hsc @@ -0,0 +1,89 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.3 0.3 0.2 0.2 0.0 0.0 0.0 +0.0 0.0 0.3 0.3 0.2 0.2 0.0 0.0 +0.0 0.0 0.0 0.3 0.3 0.2 0.2 0.0 +0.0 0.0 0.0 0.0 0.3 0.3 0.2 0.2 +0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 6 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.3 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/elstar1.seq b/src/openalea/sequence_analysis/data/elstar1.seq new file mode 100644 index 0000000..4d152f2 --- /dev/null +++ b/src/openalea/sequence_analysis/data/elstar1.seq @@ -0,0 +1,67 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1058 +# mean: 1.18053 variance: 2.51326 standard deviation: 1.58533 + +# | value histogram +# 0 633 latent bud +# 1 41 short shoot +# 2 121 long shoot +# 3 86 fruiting shoot +# 4 177 immediate shoot + +# sequence length histogram - size of the sample: 16 +# mean: 66.125 variance: 81.3167 standard deviation: 9.01758 + +# cumulative length: 1058 + +0 0 2 2 2 2 2 1 1 0 0 4 3 1 0 3 3 3 3 1 0 3 3 2 3 0 3 0 4 4 4 4 4 0 0 0 0 4 4 0 0 \ +4 0 0 0 0 4 0 0 4 4 0 0 0 0 0 0 0 0 0 0 2 0 2 2 1 1 1 1 1 1 1 + +0 2 2 3 3 3 0 3 3 0 3 0 0 3 4 4 4 4 4 4 4 0 4 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 4 4 \ +0 4 4 4 4 0 1 2 1 1 0 1 1 2 0 1 1 0 + +0 0 0 0 0 0 0 0 0 3 0 0 2 0 3 3 2 3 1 1 3 2 4 4 4 4 4 4 4 4 4 4 4 0 0 4 4 0 0 0 0 \ +0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 3 2 2 2 2 1 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 3 3 0 3 3 3 3 2 2 3 0 0 0 2 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 \ +2 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 2 1 0 1 2 1 3 1 3 3 0 1 1 0 0 4 3 0 4 0 1 2 2 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 + +0 2 3 3 3 3 3 3 0 0 0 0 0 0 4 4 4 4 4 4 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 \ +0 2 0 0 4 4 2 0 4 0 2 0 2 0 0 2 0 0 0 + +0 0 0 0 0 2 2 3 3 3 0 0 3 0 3 3 0 0 0 3 2 0 2 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 2 2 0 2 0 2 0 0 0 0 0 0 0 + +0 0 0 2 3 3 3 2 0 0 0 0 0 0 0 0 3 4 4 4 4 4 4 4 4 4 0 4 4 4 4 0 0 0 0 0 0 2 0 0 0 \ +0 0 2 0 0 0 0 2 4 0 0 2 2 2 0 0 2 2 0 0 0 0 + +0 2 3 3 3 1 3 0 3 1 0 0 0 3 3 4 4 4 4 4 4 4 4 4 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 4 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 2 2 2 1 1 0 3 1 3 1 4 4 4 3 3 3 3 0 0 2 3 2 1 0 1 0 0 4 4 4 4 4 4 0 4 0 4 4 0 \ +4 0 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0 4 4 0 2 0 0 4 0 0 0 0 0 0 + +0 2 3 3 0 3 3 0 3 3 3 3 3 3 0 3 0 0 2 2 2 2 0 2 2 0 0 2 4 4 0 4 4 0 0 4 4 0 0 0 2 \ +0 0 2 4 2 0 0 4 0 2 0 2 0 2 0 0 2 0 0 0 0 0 0 0 + +0 2 2 2 2 2 2 2 2 2 1 1 2 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 0 4 0 0 0 0 0 2 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 + +1 2 2 2 2 2 3 0 3 0 3 3 3 3 3 0 0 0 3 4 3 4 4 0 4 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 \ +4 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 2 0 0 2 4 4 4 0 2 \ +0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 3 0 0 0 3 4 4 4 4 4 4 4 4 0 4 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +2 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/fagus1.his b/src/openalea/sequence_analysis/data/fagus1.his new file mode 100644 index 0000000..858666d --- /dev/null +++ b/src/openalea/sequence_analysis/data/fagus1.his @@ -0,0 +1,11 @@ + 0 0 + 1 0 + 2 0 + 3 1 + 4 1 + 5 2 + 6 8 + 7 22 + 8 33 + 9 20 + 10 5 diff --git a/src/openalea/sequence_analysis/data/fuji1.hsc b/src/openalea/sequence_analysis/data/fuji1.hsc new file mode 100644 index 0000000..d153ad3 --- /dev/null +++ b/src/openalea/sequence_analysis/data/fuji1.hsc @@ -0,0 +1,78 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +7 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/fuji1.seq b/src/openalea/sequence_analysis/data/fuji1.seq new file mode 100644 index 0000000..92e6082 --- /dev/null +++ b/src/openalea/sequence_analysis/data/fuji1.seq @@ -0,0 +1,64 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1109 +# mean: 0.934175 variance: 1.8666 standard deviation: 1.36624 + +# | value histogram +# 0 689 latent bud +# 1 78 short shoot +# 2 178 long shoot +# 3 54 fruiting shoot +# 4 110 immediate shoot + +# sequence length histogram - size of the sample: 15 +# mean: 73.9333 variance: 20.781 standard deviation: 4.55861 + +# cumulative length: 1109 + +0 0 0 0 2 2 3 0 3 0 0 3 0 3 0 0 3 4 4 4 4 4 4 4 4 4 4 3 0 0 0 0 0 0 0 0 0 0 1 2 0 \ +0 2 0 2 0 0 2 0 2 0 0 0 0 0 2 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 3 1 2 1 3 3 0 3 1 2 0 1 4 4 4 1 4 4 0 0 1 0 0 0 0 0 4 0 0 0 0 0 \ +4 0 4 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 2 3 2 2 0 3 3 1 0 1 0 4 0 3 3 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 4 2 2 2 2 2 2 \ +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 2 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 0 3 0 0 0 0 0 0 2 0 0 0 0 0 3 2 2 2 0 0 0 0 0 0 0 0 0 1 0 1 2 1 2 2 2 2 \ +1 2 1 2 2 2 2 2 2 0 2 2 2 0 2 0 2 1 0 2 0 0 0 0 0 0 0 0 0 + +0 0 0 2 2 2 2 2 0 2 2 0 0 3 1 1 0 1 0 1 2 4 4 4 4 0 2 0 0 4 4 4 4 0 2 0 4 0 0 4 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 2 2 1 2 1 1 2 1 1 1 0 0 4 4 1 4 2 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 2 0 \ +1 2 0 1 2 2 2 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 3 2 0 0 0 4 0 0 4 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 0 0 4 0 0 \ +0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 0 0 4 4 4 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 2 0 0 0 0 0 0 + +2 2 2 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 4 4 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 2 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 2 2 3 1 1 2 1 1 1 3 3 2 3 1 2 1 3 2 1 4 4 4 4 4 4 4 4 0 4 1 0 0 0 0 0 \ +0 1 4 0 0 4 0 2 2 0 0 0 0 0 0 0 2 0 0 0 1 1 1 2 2 1 1 2 2 2 1 0 0 0 1 0 0 0 0 0 0 \ +0 + +0 0 2 2 0 2 1 0 0 1 2 0 2 0 1 1 3 1 3 0 0 0 1 1 4 4 4 4 0 0 4 0 4 0 0 4 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 2 2 0 2 2 0 0 0 2 0 0 2 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 2 0 0 0 0 0 0 0 3 0 3 0 0 3 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +2 0 0 0 0 2 0 2 0 0 0 0 0 2 0 2 2 2 2 0 0 2 0 2 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 3 0 3 0 0 3 3 3 3 4 4 4 4 0 4 4 0 0 0 0 4 0 0 0 4 0 0 4 0 4 0 0 \ +4 0 0 0 0 0 0 0 0 0 2 0 0 2 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 2 2 2 2 2 1 1 3 0 0 4 4 4 0 4 4 0 4 4 4 4 0 0 0 0 4 4 0 2 0 4 4 0 4 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 2 3 0 2 3 1 0 2 0 3 3 3 2 4 4 4 4 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 2 0 0 2 0 0 2 2 0 0 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/gala1.hsc b/src/openalea/sequence_analysis/data/gala1.hsc new file mode 100644 index 0000000..471b685 --- /dev/null +++ b/src/openalea/sequence_analysis/data/gala1.hsc @@ -0,0 +1,78 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +7 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.2 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.1 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.3 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/gala1.seq b/src/openalea/sequence_analysis/data/gala1.seq new file mode 100644 index 0000000..9078856 --- /dev/null +++ b/src/openalea/sequence_analysis/data/gala1.seq @@ -0,0 +1,69 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1190 +# mean: 1.38992 variance: 2.91764 standard deviation: 1.70811 + +# | value histogram +# 0 681 latent bud +# 1 26 short shoot +# 2 71 long shoot +# 3 162 fruiting shoot +# 4 250 immediate shoot + +# sequence length histogram - size of the sample: 17 +# mean: 70 variance: 17.125 standard deviation: 4.13824 + +# cumulative length: 1190 + +2 0 0 2 3 3 3 3 0 0 1 1 1 3 3 3 3 3 3 0 0 3 0 3 0 3 4 4 0 0 0 0 4 3 4 4 4 0 4 1 0 \ +0 0 0 0 0 0 0 0 0 1 0 4 2 0 0 0 4 0 3 4 2 0 1 0 0 0 0 0 0 4 4 0 4 0 0 0 0 + +0 2 2 2 3 3 2 3 1 3 3 3 3 4 4 4 1 1 1 1 0 4 4 4 1 0 0 4 0 4 4 0 1 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 3 1 3 3 3 3 3 3 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 0 0 0 0 0 \ +0 0 2 0 0 0 4 0 0 0 0 2 0 2 4 0 4 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 1 0 1 3 3 1 3 3 3 3 3 3 0 3 3 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 4 4 4 0 4 \ +0 0 0 0 0 0 0 0 2 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 3 3 1 3 0 0 3 0 0 2 0 3 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 0 4 0 4 \ +0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 0 3 3 3 3 3 3 3 0 3 0 3 0 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 0 4 0 0 0 0 0 0 0 \ +2 0 0 0 0 0 0 0 0 2 4 4 4 0 0 2 0 0 4 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 2 3 0 0 3 0 0 0 0 3 0 0 0 0 0 0 0 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 4 4 0 4 0 0 4 4 4 4 0 0 0 0 0 4 0 0 4 0 4 0 0 4 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 3 3 3 0 3 3 3 0 3 3 4 4 4 4 3 0 4 4 4 4 0 4 4 4 4 4 \ +4 4 4 4 0 4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 + +0 2 2 2 1 3 3 3 3 0 3 0 3 3 3 0 3 0 3 4 4 4 4 0 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 \ +0 4 4 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 2 3 3 3 3 4 4 4 4 4 3 3 3 0 0 0 4 4 4 4 4 4 0 4 4 0 0 0 0 0 0 0 0 0 0 2 \ +0 0 0 0 2 0 0 2 0 0 2 2 0 0 0 0 0 0 0 0 2 0 0 + +0 0 0 2 2 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 4 4 4 4 4 0 0 0 0 0 0 0 0 0 4 4 4 4 4 \ +4 4 4 4 0 4 4 0 4 0 0 0 0 0 0 0 0 0 2 2 0 2 0 + +0 2 3 3 3 3 3 3 3 3 3 3 0 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 0 4 0 0 3 0 0 0 0 0 0 0 0 \ +4 2 0 0 0 0 2 2 2 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 3 0 0 0 3 3 3 3 3 3 3 3 0 0 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 4 4 4 4 4 \ +4 4 0 0 0 0 2 0 0 0 1 2 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 + +2 0 0 0 0 0 0 3 0 3 3 0 3 3 0 3 0 3 0 3 3 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 3 3 0 3 0 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 4 4 4 4 4 4 4 0 0 0 \ +0 0 0 0 0 0 2 0 0 0 0 0 2 0 2 2 0 0 2 0 0 0 0 2 0 0 0 + +0 1 1 0 0 0 3 0 3 3 3 3 0 3 3 0 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 0 4 0 0 4 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 4 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 3 3 3 3 3 3 3 3 3 0 3 3 4 4 3 2 3 0 0 0 0 0 0 0 0 0 4 4 0 3 0 3 0 0 3 0 3 \ +2 0 3 3 3 2 0 1 2 2 1 0 0 0 4 4 0 4 0 0 4 4 0 4 0 4 0 0 4 0 0 0 diff --git a/src/openalea/sequence_analysis/data/granny1.hsc b/src/openalea/sequence_analysis/data/granny1.hsc new file mode 100644 index 0000000..2c1b93d --- /dev/null +++ b/src/openalea/sequence_analysis/data/granny1.hsc @@ -0,0 +1,89 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 6 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.2 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.1 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.3 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/granny1.seq b/src/openalea/sequence_analysis/data/granny1.seq new file mode 100644 index 0000000..c7c4d6a --- /dev/null +++ b/src/openalea/sequence_analysis/data/granny1.seq @@ -0,0 +1,66 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1201 +# mean: 1.21232 variance: 2.61238 standard deviation: 1.61629 + +# | value histogram +# 0 728 latent bud +# 1 18 short shoot +# 2 138 long shoot +# 3 106 fruiting shoot +# 4 211 immediate shoot + +# sequence length histogram - size of the sample: 16 +# mean: 75.0625 variance: 31.5292 standard deviation: 5.61508 + +# cumulative length: 1201 + +0 2 2 2 2 2 0 2 3 3 0 3 0 3 4 0 0 0 0 3 0 0 4 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 0 4 \ +0 2 4 4 0 0 0 0 0 0 0 0 4 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 1 2 2 2 2 2 0 0 3 0 3 2 3 0 3 0 3 3 4 4 0 4 0 4 0 3 3 0 0 0 4 0 0 4 4 0 0 0 \ +0 0 0 0 0 0 0 0 4 0 1 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 2 0 2 2 2 2 2 2 2 0 3 3 3 3 3 3 3 0 3 3 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 4 4 4 4 0 2 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 0 3 0 0 0 0 0 0 0 0 4 4 4 4 0 4 0 0 0 0 4 4 4 4 \ +0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 2 2 2 2 0 2 2 2 3 3 2 3 3 0 3 3 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 4 \ +4 4 4 4 4 4 4 4 0 0 0 0 4 0 0 4 0 2 0 0 0 0 0 0 1 4 4 0 0 0 0 4 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 2 2 2 3 3 3 2 0 3 0 0 0 0 4 3 0 0 0 4 4 4 4 4 4 4 4 4 4 0 0 4 4 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 2 2 2 3 2 3 3 3 3 0 3 3 0 0 0 3 0 0 0 2 0 3 3 2 4 0 4 4 4 4 4 4 4 \ +4 4 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 2 4 4 2 2 0 0 0 0 0 0 0 + +0 0 0 0 2 2 2 0 2 2 3 2 0 3 1 2 3 0 4 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 2 2 4 0 4 3 0 0 0 3 4 4 4 0 0 3 0 0 0 0 0 4 4 4 4 0 4 0 4 4 0 0 0 0 0 0 \ +0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 2 2 2 3 0 3 0 0 0 3 0 3 0 3 3 3 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 0 0 4 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 2 4 4 4 0 2 0 2 0 0 0 0 0 0 + +0 0 2 2 2 2 0 2 0 3 3 3 0 3 3 3 3 0 3 0 0 0 0 0 0 2 0 3 0 4 0 4 4 4 4 4 4 0 0 0 0 \ +0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 0 4 2 0 0 0 0 0 0 0 0 + +2 2 2 2 2 2 2 2 2 3 3 0 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 \ +4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 0 2 2 0 2 2 3 0 0 3 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 0 4 4 0 \ +0 0 0 0 1 1 1 1 0 2 0 1 0 1 2 0 0 0 1 2 2 1 0 1 2 0 1 0 0 2 0 1 0 0 0 0 + +0 2 2 2 2 2 3 2 3 3 0 3 3 3 3 0 3 0 3 3 3 3 0 0 0 0 4 4 4 4 4 4 4 4 0 0 4 3 0 0 4 \ +4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 2 2 2 2 2 2 3 3 3 3 3 3 3 0 0 0 0 0 3 3 3 0 0 0 3 4 4 4 4 4 4 4 4 4 4 4 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 2 2 2 2 0 0 2 0 2 2 2 0 0 0 2 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/laricio_date66.seq b/src/openalea/sequence_analysis/data/laricio_date66.seq new file mode 100644 index 0000000..5d4bb44 --- /dev/null +++ b/src/openalea/sequence_analysis/data/laricio_date66.seq @@ -0,0 +1,65 @@ +3 VARIABLES + +VARIABLE 1 : STATE # !!! was TIME. Switched to STATE otherwise reading function fails +VARIABLE 2 : STATE # longueur de l'UC +VARIABLE 3 : STATE # nombre de branches par UC + +27 330 7 | 28 290 8 | 29 250 6 | 30 320 5 | 31 440 5 | 32 440 7 | 33 480 4 | 34 470 6 \ +35 570 5 | 36 640 7 | 37 700 6 | 38 650 1 | 39 590 5 | 40 680 6 | 41 640 5 | 42 630 6 \ +43 530 5 | 44 540 5 | 45 670 7 | 46 750 7 | 47 530 5 | 48 820 6 | 49 590 6 | 50 650 5 \ +51 650 6 | 52 700 6 | 53 710 5 | 54 660 6 | 55 650 5 | 56 660 4 | 57 620 4 | 58 510 5 \ +59 630 6 | 60 760 4 | 61 540 1 | 62 360 4 | 63 500 4 | 64 460 5 | 65 460 4 | 66 520 4 \ +67 610 5 | 68 560 5 | 69 550 5 | 70 540 5 | 71 560 3 | 72 380 3 | 73 350 3 | 74 450 2 \ +75 180 4 | 76 470 5 | 77 350 5 | 78 520 2 | 79 390 5 | 80 420 5 | 81 510 5 | 82 240 0 \ +83 250 8 | 84 290 3 | 85 280 2 | 86 190 4 | 87 230 3 | 88 400 4 | 89 380 5 | 90 240 4 \ +91 180 3 | 92 210 4 # (1) + +27 110 1 | 28 210 3 | 29 180 3 | 30 170 4 | 31 270 4 | 32 360 6 | 33 410 5 | 34 390 6 \ +35 410 6 | 36 600 6 | 37 590 5 | 38 630 6 | 39 640 7 | 40 610 5 | 41 600 8 | 42 620 7 \ +43 650 6 | 44 680 7 | 45 710 4 | 46 830 7 | 47 660 8 | 48 870 7 | 49 630 7 | 50 520 6 \ +51 610 6 | 52 630 7 | 53 790 5 | 54 640 6 | 55 640 6 | 56 680 7 | 57 560 5 | 58 670 8 \ +59 700 5 | 60 580 5 | 61 410 4 | 62 550 5 | 63 370 4 | 64 380 5 | 65 510 6 | 66 360 6 \ +67 610 6 | 68 490 6 | 69 470 5 | 70 610 6 | 71 450 5 | 72 370 5 | 73 380 6 | 74 400 4 \ +75 410 4 | 76 470 4 | 77 470 5 | 78 500 4 | 79 450 5 | 80 440 6 | 81 450 5 | 82 490 5 \ +83 430 6 | 84 350 5 | 85 300 5 | 86 130 3 | 87 110 5 | 88 210 4 | 89 270 4 | 90 200 3 \ +91 90 3 | 92 160 3 # (2) + +27 160 4 | 28 200 5 | 29 260 3 | 30 200 4 | 31 220 4 | 32 290 5 | 33 340 5 | 34 370 1 \ +35 320 5 | 36 370 4 | 37 440 5 | 38 580 7 | 39 430 2 | 40 500 5 | 41 340 6 | 42 340 5 \ +43 440 4 | 44 380 4 | 45 320 5 | 46 430 5 | 47 350 5 | 48 490 5 | 49 520 6 | 50 500 4 \ +51 550 5 | 52 660 5 | 53 620 5 | 54 800 5 | 55 660 5 | 56 670 6 | 57 580 7 | 58 450 6 \ +59 390 5 | 60 630 5 | 61 550 7 | 62 750 7 | 63 530 6 | 64 560 6 | 65 640 6 | 66 500 7 \ +67 570 6 | 68 540 6 | 69 530 6 | 70 640 5 | 71 490 5 | 72 640 5 | 73 420 4 | 74 520 4 \ +75 530 6 | 76 540 5 | 77 380 3 | 78 430 4 | 79 490 6 | 80 450 4 | 81 500 7 | 82 520 5 \ +83 500 7 | 84 510 6 | 85 360 4 | 86 190 5 | 87 220 6 | 88 240 4 | 89 240 5 | 90 210 0 \ +91 130 2 | 92 130 2 # (3) + +27 210 4 | 28 230 6 | 29 360 5 | 30 710 6 | 31 830 6 | 32 550 6 | 33 670 6 | 34 650 8 \ +35 810 8 | 36 780 7 | 37 820 7 | 38 900 8 | 39 670 8 | 40 710 8 | 41 670 8 | 42 820 8 \ +43 820 6 | 44 640 6 | 45 570 7 | 46 680 6 | 47 520 6 | 48 600 5 | 49 530 6 | 50 560 6 \ +51 760 6 | 52 680 8 | 53 490 6 | 54 440 4 | 55 410 5 | 56 540 4 | 57 360 6 | 58 540 5 \ +59 600 6 | 60 380 5 | 61 470 5 | 62 500 3 | 63 210 2 | 64 240 5 | 65 330 4 | 66 290 4 \ +67 430 3 | 68 250 4 | 69 430 5 | 70 450 5 | 71 410 6 | 72 360 4 | 73 310 4 | 74 420 4 \ +75 430 5 | 76 270 4 | 77 140 2 | 78 220 4 | 79 290 4 | 80 50 4 | 81 310 4 | 82 230 4 \ +83 180 4 | 84 130 2 | 85 120 2 | 86 100 1 | 87 80 2 | 88 160 4 | 89 200 2 | 90 100 2 \ +91 110 2 | 92 190 4 # (4) + +27 110 3 | 28 180 4 | 29 100 5 | 30 210 6 | 31 500 9 | 32 570 8 | 33 590 9 | 34 610 10 \ +35 700 10 | 36 700 11 | 37 640 12 | 38 580 9 | 39 630 11 | 40 670 9 | 41 470 7 | 42 570 11 \ +43 740 9 | 44 610 11 | 45 660 13 | 46 670 8 | 47 500 8 | 48 550 7 | 49 540 10 | 50 490 7 \ +51 640 8 | 52 550 9 | 53 570 7 | 54 480 7 | 55 480 9 | 56 630 7 | 57 460 10 | 58 640 9 \ +59 610 9 | 60 480 8 | 61 490 8 | 62 560 9 | 63 410 5 | 64 420 6 | 65 470 5 | 66 420 5 \ +67 540 7 | 68 420 5 | 69 540 7 | 70 480 5 | 71 530 7 | 72 520 7 | 73 390 8 | 74 480 4 \ +75 320 3 | 76 390 6 | 77 290 4 | 78 240 3 | 79 260 5 | 80 340 5 | 81 250 4 | 82 420 7 \ +83 360 7 | 84 320 6 | 85 300 6 | 86 290 6 | 87 260 5 | 88 320 5 | 89 330 8 | 90 350 8 \ +91 120 2 | 92 190 5 # (5) + +27 130 2 | 28 380 5 | 29 220 5 | 30 410 5 | 31 510 7 | 32 530 5 | 33 610 5 | 34 720 8 \ +35 540 5 | 36 600 5 | 37 510 7 | 38 610 7 | 39 540 6 | 40 580 5 | 41 440 8 | 42 540 6 \ +43 470 6 | 44 480 6 | 45 450 6 | 46 510 6 | 47 360 4 | 48 470 5 | 49 380 4 | 50 350 4 \ +51 440 5 | 52 500 5 | 53 440 4 | 54 410 4 | 55 420 5 | 56 590 6 | 57 350 5 | 58 530 4 \ +59 460 4 | 60 300 4 | 61 500 4 | 62 370 4 | 63 190 2 | 64 240 4 | 65 490 4 | 66 390 4 \ +67 520 5 | 68 490 4 | 69 500 4 | 70 570 6 | 71 410 4 | 72 500 5 | 73 370 3 | 74 420 5 \ +75 390 4 | 76 210 4 | 77 140 1 | 78 150 4 | 79 290 4 | 80 170 4 | 81 210 3 | 82 310 4 \ +83 120 1 | 84 250 4 | 85 140 3 | 86 130 3 | 87 110 2 | 88 200 3 | 89 210 4 | 90 270 3 \ +91 130 4 | 92 180 3 # (6) diff --git a/src/openalea/sequence_analysis/data/laricio_position66.seq b/src/openalea/sequence_analysis/data/laricio_position66.seq new file mode 100644 index 0000000..a217d30 --- /dev/null +++ b/src/openalea/sequence_analysis/data/laricio_position66.seq @@ -0,0 +1,49 @@ +# pins laricio de 75 ans + +2 VARIABLES + +VARIABLE 1 : POSITION_INTERVAL # longueur de l'UC +VARIABLE 2 : STATE # nombre de branches par UC + +330 7 | 290 8 | 250 6 | 320 5 | 440 5 | 440 7 | 480 4 | 470 6 | 570 5 | 640 7 | 700 6 \ +650 1 | 590 5 | 680 6 | 640 5 | 630 6 | 530 5 | 540 5 | 670 7 | 750 7 | 530 5 | 820 6 \ +590 6 | 650 5 | 650 6 | 700 6 | 710 5 | 660 6 | 650 5 | 660 4 | 620 4 | 510 5 | 630 6 \ +760 4 | 540 1 | 360 4 | 500 4 | 460 5 | 460 4 | 520 4 | 610 5 | 560 5 | 550 5 | 540 5 \ +560 3 | 380 3 | 350 3 | 450 2 | 180 4 | 470 5 | 350 5 | 520 2 | 390 5 | 420 5 | 510 5 \ +240 0 | 250 8 | 290 3 | 280 2 | 190 4 | 230 3 | 400 4 | 380 5 | 240 4 | 180 3 | 210 4 | 0 + +110 1 | 210 3 | 180 3 | 170 4 | 270 4 | 360 6 | 410 5 | 390 6 | 410 6 | 600 6 | 590 5 \ +630 6 | 640 7 | 610 5 | 600 8 | 620 7 | 650 6 | 680 7 | 710 4 | 830 7 | 660 8 | 870 7 \ +630 7 | 520 6 | 610 6 | 630 7 | 790 5 | 640 6 | 640 6 | 680 7 | 560 5 | 670 8 | 700 5 \ +580 5 | 410 4 | 550 5 | 370 4 | 380 5 | 510 6 | 360 6 | 610 6 | 490 6 | 470 5 | 610 6 \ +450 5 | 370 5 | 380 6 | 400 4 | 410 4 | 470 4 | 470 5 | 500 4 | 450 5 | 440 6 | 450 5 \ +490 5 | 430 6 | 350 5 | 300 5 | 130 3 | 110 5 | 210 4 | 270 4 | 200 3 | 90 3 | 160 3 | 0 + +160 4 | 200 5 | 260 3 | 200 4 | 220 4 | 290 5 | 340 5 | 370 1 | 320 5 | 370 4 | 440 5 \ +580 7 | 430 2 | 500 5 | 340 6 | 340 5 | 440 4 | 380 4 | 320 5 | 430 5 | 350 5 | 490 5 \ +520 6 | 500 4 | 550 5 | 660 5 | 620 5 | 800 5 | 660 5 | 670 6 | 580 7 | 450 6 | 390 5 \ +630 5 | 550 7 | 750 7 | 530 6 | 560 6 | 640 6 | 500 7 | 570 6 | 540 6 | 530 6 | 640 5 \ +490 5 | 640 5 | 420 4 | 520 4 | 530 6 | 540 5 | 380 3 | 430 4 | 490 6 | 450 4 | 500 7 \ +520 5 | 500 7 | 510 6 | 360 4 | 190 5 | 220 6 | 240 4 | 240 5 | 210 0 | 130 2 | 130 2 | 0 + +210 4 | 230 6 | 360 5 | 710 6 | 830 6 | 550 6 | 670 6 | 650 8 | 810 8 | 780 7 | 820 7 \ +900 8 | 670 8 | 710 8 | 670 8 | 820 8 | 820 6 | 640 6 | 570 7 | 680 6 | 520 6 | 600 5 \ +530 6 | 560 6 | 760 6 | 680 8 | 490 6 | 440 4 | 410 5 | 540 4 | 360 6 | 540 5 | 600 6 \ +380 5 | 470 5 | 500 3 | 210 2 | 240 5 | 330 4 | 290 4 | 430 3 | 250 4 | 430 5 | 450 5 \ +410 6 | 360 4 | 310 4 | 420 4 | 430 5 | 270 4 | 140 2 | 220 4 | 290 4 | 50 4 | 310 4 \ +230 4 | 180 4 | 130 2 | 120 2 | 100 1 | 80 2 | 160 4 | 200 2 | 100 2 | 110 2 | 190 4 | 0 + +110 3 | 180 4 | 100 5 | 210 6 | 500 9 | 570 8 | 590 9 | 610 10 | 700 10 | 700 11 \ +640 12 | 580 9 | 630 11 | 670 9 | 470 7 | 570 11 | 740 9 | 610 11 | 660 13 | 670 8 \ +500 8 | 550 7 | 540 10 | 490 7 | 640 8 | 550 9 | 570 7 | 480 7 | 480 9 | 630 7 | 460 10 \ +640 9 | 610 9 | 480 8 | 490 8 | 560 9 | 410 5 | 420 6 | 470 5 | 420 5 | 540 7 | 420 5 \ +540 7 | 480 5 | 530 7 | 520 7 | 390 8 | 480 4 | 320 3 | 390 6 | 290 4 | 240 3 | 260 5 \ +340 5 | 250 4 | 420 7 | 360 7 | 320 6 | 300 6 | 290 6 | 260 5 | 320 5 | 330 8 | 350 8 \ +120 2 | 190 5 | 0 + +130 2 | 380 5 | 220 5 | 410 5 | 510 7 | 530 5 | 610 5 | 720 8 | 540 5 | 600 5 | 510 7 \ +610 7 | 540 6 | 580 5 | 440 8 | 540 6 | 470 6 | 480 6 | 450 6 | 510 6 | 360 4 | 470 5 \ +380 4 | 350 4 | 440 5 | 500 5 | 440 4 | 410 4 | 420 5 | 590 6 | 350 5 | 530 4 | 460 4 \ +300 4 | 500 4 | 370 4 | 190 2 | 240 4 | 490 4 | 390 4 | 520 5 | 490 4 | 500 4 | 570 6 \ +410 4 | 500 5 | 370 3 | 420 5 | 390 4 | 210 4 | 140 1 | 150 4 | 290 4 | 170 4 | 210 3 \ +310 4 | 120 1 | 250 4 | 140 3 | 130 3 | 110 2 | 200 3 | 210 4 | 270 3 | 130 4 | 180 3 | 0 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_12.seq b/src/openalea/sequence_analysis/data/pin_laricio_12.seq new file mode 100644 index 0000000..786e54d --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_12.seq @@ -0,0 +1,361 @@ +# arbres de 12 ans, parcelle 607 + +# 5 VARIABLES + +# VARIABLE 1 : TIME +# VARIABLE 2 : INT longueur de la pousse +# VARIABLE 3 : INT nombre de branches par UC inter +# VARIABLE 4 : INT nombre de branches totale UC intra et inter +# VARIABLE 5 : INT nombre de cycles + +INDEX_PARAMETER : TIME + +4 VARIABLES + +VARIABLE 1 : INT # longueur de la pousse +VARIABLE 2 : INT # nombre de branches par UC inter +VARIABLE 3 : INT # nombre de branches totale UC intra et inter +VARIABLE 4 : INT # nombre de cycles + +1985 55 2 2 1 \ +1986 100 6 6 1 \ +1987 75 4 4 1 \ +1988 320 6 6 1 \ +1989 380 8 8 1 \ +1990 300 6 6 1 \ +1991 250 5 5 1 \ +1992 560 7 7 1 \ +1993 610 8 8 1 \ +1994 580 6 6 1 \ +1995 580 7 7 1 + +1985 30 2 2 1 \ +1986 45 2 2 1 \ +1987 30 3 3 1 \ +1988 130 3 3 1 \ +1989 235 4 4 1 \ +1990 130 6 6 1 \ +1991 85 6 6 1 \ +1992 235 5 5 1 \ +1993 270 5 5 1 \ +1994 320 5 5 1 \ +1995 430 6 6 1 + +1985 70 2 2 1 \ +1986 110 5 5 1 \ +1987 100 5 5 1 \ +1988 240 5 5 1 \ +1989 330 5 5 1 \ +1990 300 8 8 1 \ +1991 170 3 3 1 \ +1992 360 6 6 1 \ +1993 450 4 4 1 \ +1994 520 5 5 1 \ +1995 580 6 6 1 + +1985 90 1 1 1 \ +1986 75 6 6 1 \ +1987 175 5 5 1 \ +1988 390 5 5 1 \ +1989 350 5 5 1 \ +1990 300 4 4 1 \ +1991 270 7 7 1 \ +1992 420 5 5 1 \ +1993 540 5 5 1 \ +1994 420 3 3 1 \ +1995 490 7 7 1 + +1986 130 2 2 1 \ +1987 65 4 4 1 \ +1988 85 2 2 1 \ +1989 185 4 4 1 \ +1990 155 5 5 1 \ +1991 110 5 5 1 \ +1992 360 7 7 1 \ +1993 310 4 4 1 \ +1994 470 6 6 1 \ +1995 640 8 8 1 + +1985 50 4 4 1 \ +1986 80 5 5 1 \ +1987 100 6 6 1 \ +1988 350 5 8 2 \ +1989 340 5 7 2 \ +1990 270 6 6 1 \ +1991 240 3 3 1 \ +1992 420 7 7 1 \ +1993 490 5 5 1 \ +1994 450 5 5 1 \ +1995 460 7 7 1 + +1985 60 1 1 1 \ +1986 110 3 3 1 \ +1987 75 5 5 1 \ +1988 215 5 5 1 \ +1989 250 6 6 1 \ +1990 170 6 6 1 \ +1991 130 4 4 1 \ +1992 260 6 6 1 \ +1993 240 5 5 1 \ +1994 360 6 6 1 \ +1995 520 7 7 1 + +1985 50 2 2 1 \ +1986 90 3 3 1 \ +1987 70 5 5 1 \ +1988 180 4 4 1 \ +1989 330 5 5 1 \ +1990 180 5 5 1 \ +1991 110 4 4 1 \ +1992 380 5 5 1 \ +1993 370 5 5 1 \ +1994 390 5 5 1 \ +1995 480 6 6 1 + +1986 75 1 1 1 \ +1987 145 2 2 1 \ +1988 180 2 2 1 \ +1989 340 5 10 2 \ +1990 250 5 5 1 \ +1991 240 4 4 1 \ +1992 260 5 5 1 \ +1993 290 5 5 1 \ +1994 510 7 7 1 \ +1995 580 7 7 1 + +1985 60 3 3 1 \ +1986 40 5 5 1 \ +1987 80 5 5 1 \ +1988 190 5 5 1 \ +1989 280 8 8 1 \ +1990 230 5 5 1 \ +1991 260 6 6 1 \ +1992 470 7 7 1 \ +1993 500 7 7 1 \ +1994 530 8 8 1 \ +1995 600 8 8 1 + +1985 60 1 1 1 \ +1986 60 3 3 1 \ +1987 60 3 3 1 \ +1988 190 4 4 1 \ +1989 240 5 5 1 \ +1990 170 5 5 1 \ +1991 70 2 2 1 \ +1992 160 5 5 1 \ +1993 180 4 4 1 \ +1994 330 5 5 1 \ +1995 440 7 7 1 + +1985 40 2 2 1 \ +1986 80 2 2 1 \ +1987 40 4 4 1 \ +1988 230 5 5 1 \ +1989 310 5 5 1 \ +1990 190 5 5 1 \ +1991 170 5 5 1 \ +1992 350 6 6 1 \ +1993 350 5 5 1 \ +1994 460 7 7 1 \ +1995 500 7 7 1 + +1985 30 1 1 1 \ +1986 100 1 1 1 \ +1987 45 3 3 1 \ +1988 125 3 3 1 \ +1989 230 5 5 1 \ +1990 170 5 5 1 \ +1991 160 4 4 1 \ +1992 380 5 5 1 \ +1993 380 5 5 1 \ +1994 400 5 5 1 \ +1995 470 6 6 1 + +1985 50 2 2 1 \ +1986 60 2 2 1 \ +1987 40 4 4 1 \ +1988 140 4 4 1 \ +1989 230 5 5 1 \ +1990 120 5 5 1 \ +1991 160 4 4 1 \ +1992 290 6 6 1 \ +1993 320 5 5 1 \ +1994 340 5 5 1 \ +1995 410 5 5 1 + +1985 40 1 1 1 \ +1986 130 5 5 1 \ +1987 130 6 6 1 \ +1988 290 6 6 1 \ +1989 440 6 6 1 \ +1990 360 4 4 1 \ +1991 360 6 6 1 \ +1992 510 6 6 1 \ +1993 460 8 8 1 \ +1994 490 8 8 1 \ +1995 590 6 6 1 + +1986 140 2 2 1 \ +1987 110 2 2 1 \ +1988 220 3 3 1 \ +1989 290 5 5 1 \ +1990 240 4 4 1 \ +1991 240 3 3 1 \ +1992 460 6 6 1 \ +1993 460 5 5 1 \ +1994 500 5 5 1 \ +1995 510 5 5 1 + +1985 50 1 1 1 \ +1986 90 4 4 1 \ +1987 140 5 5 1 \ +1988 150 4 4 1 \ +1989 260 5 5 1 \ +1990 250 4 4 1 \ +1991 230 3 3 1 \ +1992 430 6 6 1 \ +1993 440 7 7 1 \ +1994 460 5 5 1 \ +1995 620 8 8 1 + +1985 70 3 3 1 \ +1986 70 5 5 1 \ +1987 130 4 4 1 \ +1988 210 4 4 1 \ +1989 180 3 3 1 \ +1990 260 4 4 1 \ +1991 240 6 6 1 \ +1992 430 6 6 1 \ +1993 480 6 6 1 \ +1994 440 7 7 1 \ +1995 560 5 5 1 + +# 1986 0 2 2 1 \ +1987 75 3 3 1 \ +1988 170 5 5 1 \ +1989 280 4 4 1 \ +1990 230 5 5 1 \ +1991 160 3 3 1 \ +1992 290 4 4 1 \ +1993 280 3 3 1 \ +1994 440 5 5 1 \ +1995 510 3 3 1 + +1985 90 4 4 1 \ +1986 80 4 4 1 \ +1987 80 3 3 1 \ +1988 250 9 14 2 \ +1989 270 7 7 1 \ +1990 320 7 7 1 \ +1991 300 6 6 1 \ +1992 500 8 8 1 \ +1993 500 6 6 1 \ +1994 470 8 8 1 \ +1995 520 7 7 1 + +1985 80 4 4 1 \ +1986 130 4 4 1 \ +1987 60 4 4 1 \ +1988 520 7 7 1 \ +1989 380 7 7 1 \ +1990 300 5 5 1 \ +1991 230 6 6 1 \ +1992 400 6 6 1 \ +1993 370 5 5 1 \ +1994 510 7 7 1 \ +1995 620 7 7 1 + +1985 30 1 1 1 \ +1986 70 3 3 1 \ +1987 70 5 5 1 \ +1988 210 5 5 1 \ +1989 310 8 8 1 \ +1990 270 5 5 1 \ +1991 320 6 6 1 \ +1992 290 6 6 1 \ +1993 230 6 6 1 \ +1994 400 7 7 1 \ +1995 580 7 7 1 + +1985 50 1 1 1 \ +1986 80 5 5 1 \ +1987 90 3 7 2 \ +1988 170 4 9 2 \ +1989 270 7 7 1 \ +1990 190 6 6 1 \ +1991 180 4 4 1 \ +1992 390 6 6 1 \ +1993 420 6 6 1 \ +1994 480 8 8 1 \ +1995 600 8 8 1 + +1985 60 2 2 1 \ +1986 70 3 3 1 \ +1987 90 5 5 1 \ +1988 190 5 5 1 \ +1989 270 8 8 1 \ +1990 290 5 5 1 \ +1991 340 6 6 1 \ +1992 510 8 8 1 \ +1993 520 8 8 1 \ +1994 580 8 8 1 \ +1995 630 6 6 1 + +1985 40 3 3 1 \ +1986 75 3 3 1 \ +1987 45 4 4 1 \ +1988 160 3 6 2 \ +1989 165 6 6 1 \ +1990 180 5 5 1 \ +1991 195 5 7 2 \ +1992 300 3 3 1 \ +1993 400 4 4 1 \ +1994 430 5 5 1 \ +1995 530 6 6 1 + +1985 40 2 2 1 \ +1986 60 4 4 1 \ +1987 70 6 6 1 \ +1988 250 6 6 1 \ +1989 250 8 8 1 \ +1990 240 5 5 1 \ +1991 240 5 5 1 \ +1992 460 7 7 1 \ +1993 520 8 8 1 \ +1994 490 8 8 1 \ +1995 630 7 7 1 + +# 1986 0 1 1 1 \ +1987 130 4 4 1 \ +1988 200 4 4 1 \ +1989 230 7 7 1 \ +1990 200 6 6 1 \ +1991 160 4 4 1 \ +1992 340 6 6 1 \ +1993 410 5 5 1 \ +1994 450 6 6 1 \ +1995 520 6 6 1 + +1985 50 2 2 1 \ +1986 80 7 7 1 \ +1987 70 5 5 1 \ +1988 250 7 7 1 \ +1989 280 6 6 1 \ +1990 250 5 5 1 \ +1991 210 5 5 1 \ +1992 350 7 7 1 \ +1993 270 3 3 1 \ +1994 400 7 7 1 \ +1995 620 5 5 1 + +1985 30 3 3 1 \ +1986 60 3 3 1 \ +1987 60 2 2 1 \ +1988 120 4 4 1 \ +1989 280 5 5 1 \ +1990 210 7 7 1 \ +1991 90 3 3 1 \ +1992 350 7 7 1 \ +1993 350 6 6 1 \ +1994 380 7 7 1 \ +1995 430 6 6 1 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_18.seq b/src/openalea/sequence_analysis/data/pin_laricio_18.seq new file mode 100644 index 0000000..cb0ea1e --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_18.seq @@ -0,0 +1,545 @@ +# arbres de 18 ans, parcelle 600 + +# 5 VARIABLES + +# VARIABLE 1 : TIME +# VARIABLE 2 : VALUE longueur de la pousse +# VARIABLE 3 : VALUE nombre de branches par UC inter +# VARIABLE 4 : VALUE nombre de branches totale UC intra et inter +# VARIABLE 5 : VALUE nombre de cycles + +INDEX_PARAMETER : TIME + +4 VARIABLES + +VARIABLE 1 : INT # longueur de la pousse +VARIABLE 2 : INT # nombre de branches par UC inter +VARIABLE 3 : INT # nombre de branches totale UC intra et inter +VARIABLE 4 : INT # nombre de cycles + +1979 30 1 1 1 \ +1980 100 4 4 1 \ +1981 90 5 5 1 \ +1982 150 3 7 2 \ +1983 350 6 6 1 \ +1984 365 6 6 1 \ +1985 200 5 5 1 \ +1986 270 5 5 1 \ +1987 190 5 5 1 \ +1988 440 7 7 1 \ +1989 410 6 6 1 \ +1990 560 7 7 1 \ +1991 430 5 5 1 \ +1992 700 8 8 1 \ +1993 410 5 5 1 \ +1994 650 7 7 1 \ +1995 760 8 8 1 + +1980 100 1 1 1 \ +1981 70 5 5 1 \ +1982 100 2 2 1 \ +1983 110 3 3 1 \ +1984 200 7 7 1 \ +1985 450 6 6 1 \ +1986 270 3 5 2 \ +1987 140 5 5 1 \ +1988 380 6 6 1 \ +1989 500 8 8 1 \ +1990 410 5 5 1 \ +1991 260 5 5 1 \ +1992 450 7 7 1 \ +1993 290 5 5 1 \ +1994 530 7 7 1 \ +1995 640 6 6 1 + +1980 50 2 2 1 \ +1981 40 3 3 1 \ +1982 200 5 5 1 \ +1983 395 8 8 1 \ +1984 360 6 6 1 \ +1985 345 7 7 1 \ +1986 360 6 6 1 \ +1987 310 6 6 1 \ +1988 540 8 8 1 \ +1989 510 11 11 1 \ +1990 340 5 5 1 \ +1991 410 7 7 1 \ +1992 680 8 8 1 \ +1993 600 8 14 2 \ +1994 430 5 5 1 \ +1995 750 8 13 2 + +1981 100 2 2 1 \ +1982 115 4 4 1 \ +1983 225 3 3 1 \ +1984 225 4 4 1 \ +1985 165 5 5 1 \ +1986 170 5 5 1 \ +1987 160 4 4 1 \ +1988 210 5 5 1 \ +1989 360 5 5 1 \ +1990 350 5 5 1 \ +1991 230 6 6 1 \ +1992 500 5 5 1 \ +1993 360 4 4 1 \ +1994 480 6 6 1 \ +1995 580 6 6 1 + +1979 70 1 1 1 \ +1980 70 3 3 1 \ +1981 70 3 3 1 \ +1982 110 8 8 1 \ +1983 170 4 4 1 \ +1984 100 3 3 1 \ +1985 100 4 4 1 \ +1986 120 3 3 1 \ +1987 70 4 4 1 \ +1988 70 7 7 1 \ +1989 90 5 5 1 \ +1990 90 3 3 1 \ +1991 40 4 4 1 \ +1992 140 5 5 1 \ +1993 150 4 4 1 \ +1994 310 6 6 1 \ +1995 380 5 5 1 + +1979 50 1 1 1 \ +1980 60 5 5 1 \ +1981 70 4 4 1 \ +1982 320 5 5 1 \ +1983 390 5 5 1 \ +1984 290 5 5 1 \ +1985 360 6 6 1 \ +1986 410 7 7 1 \ +1987 370 7 7 1 \ +1988 550 8 8 1 \ +1989 460 5 5 1 \ +1990 550 7 7 1 \ +1991 470 6 6 1 \ +1992 580 7 7 1 \ +1993 570 6 6 1 \ +1994 610 7 7 1 \ +1995 700 7 7 1 + +1980 80 1 1 1 \ +1981 60 1 1 1 \ +1982 130 2 2 1 \ +1983 340 8 8 1 \ +1984 260 6 6 1 \ +1985 210 6 6 1 \ +1986 240 3 3 1 \ +1987 220 4 4 1 \ +1988 440 7 7 1 \ +1989 440 7 7 1 \ +1990 420 6 6 1 \ +1991 290 4 4 1 \ +1992 620 8 8 1 \ +1993 460 6 6 1 \ +1994 460 7 7 1 \ +1995 590 8 8 1 + +1980 30 1 1 1 \ +1981 10 1 1 1 \ +1982 50 2 2 1 \ +1983 80 2 2 1 \ +1984 125 2 2 1 \ +1985 95 4 4 1 \ +1986 160 4 4 1 \ +1987 220 3 3 1 \ +1988 180 3 3 1 \ +1989 300 5 5 1 \ +1990 250 4 4 1 \ +1991 130 4 4 1 \ +1992 180 5 5 1 \ +1993 140 3 3 1 \ +1994 250 5 5 1 \ +1995 390 6 6 1 + +1980 90 1 1 1 \ +1981 60 2 2 1 \ +1982 90 1 1 1 \ +1983 320 8 8 1 \ +1984 180 5 5 1 \ +1985 100 5 5 1 \ +1986 130 5 5 1 \ +1987 210 7 7 1 \ +1988 330 8 8 1 \ +1989 370 7 7 1 \ +1990 440 6 6 1 \ +1991 290 6 6 1 \ +1992 530 8 8 1 \ +1993 370 7 7 1 \ +1994 460 9 9 1 \ +1995 550 8 8 1 + +1981 50 2 2 1 \ +1982 75 2 2 1 \ +1983 195 3 3 1 \ +1984 240 4 4 1 \ +1985 95 3 3 1 \ +1986 105 5 5 1 \ +1987 145 3 3 1 \ +1988 180 5 5 1 \ +1989 185 6 6 1 \ +1990 225 4 4 1 \ +1991 150 4 4 1 \ +1992 270 5 5 1 \ +1993 210 4 4 1 \ +1994 310 6 6 1 \ +1995 400 4 4 1 + +1979 90 1 1 1 \ +1980 70 3 3 1 \ +1981 50 3 3 1 \ +1982 80 3 3 1 \ +1983 170 4 4 1 \ +1984 220 5 5 1 \ +1985 180 5 5 1 \ +1986 150 3 3 1 \ +1987 130 3 3 1 \ +1988 150 5 5 1 \ +1989 230 5 5 1 \ +1990 250 5 5 1 \ +1991 150 4 4 1 \ +1992 270 7 7 1 \ +1993 340 6 6 1 \ +1994 440 6 6 1 \ +1995 500 7 7 1 + +1979 45 1 1 1 \ +1980 110 3 3 1 \ +1981 70 4 4 1 \ +1982 155 3 3 1 \ +1983 315 4 4 1 \ +1984 240 5 5 1 \ +1985 180 5 5 1 \ +1986 150 3 3 1 \ +1987 85 3 3 1 \ +1988 165 5 5 1 \ +1989 250 5 5 1 \ +1990 260 5 5 1 \ +1991 140 3 3 1 \ +1992 270 5 5 1 \ +1993 300 4 4 1 \ +1994 390 6 6 1 \ +1995 500 6 6 1 + +1979 70 2 2 1 \ +1980 40 1 1 1 \ +1981 30 2 2 1 \ +1982 200 5 5 1 \ +1983 340 8 8 1 \ +1984 210 5 5 1 \ +1985 190 5 5 1 \ +1986 230 5 5 1 \ +1987 160 3 3 1 \ +1988 140 4 4 1 \ +1989 180 5 5 1 \ +1990 330 4 4 1 \ +1991 150 5 5 1 \ +1992 490 6 6 1 \ +1993 240 7 7 1 \ +1994 430 4 4 1 \ +1995 620 6 6 1 + +1979 80 4 4 1 \ +1980 70 3 3 1 \ +1981 90 2 8 2 \ +1982 140 4 4 1 \ +1983 240 5 5 1 \ +1984 310 5 5 1 \ +1985 330 8 8 1 \ +1986 250 6 6 1 \ +1987 220 6 6 1 \ +1988 300 6 6 1 \ +1989 300 6 6 1 \ +1990 330 5 5 1 \ +1991 240 5 5 1 \ +1992 430 5 5 1 \ +1993 400 4 4 1 \ +1994 310 8 8 1 \ +1995 620 6 6 1 + +1979 40 2 2 1 \ +1980 70 2 2 1 \ +1981 55 3 3 1 \ +1982 75 2 3 2 \ +1983 310 5 8 2 \ +1984 175 4 7 2 \ +1985 170 2 2 1 \ +1986 135 4 4 1 \ +1987 190 5 5 1 \ +1988 190 4 4 1 \ +1989 280 5 5 1 \ +1990 270 5 5 1 \ +1991 130 2 2 1 \ +1992 270 5 5 1 \ +1993 300 4 4 1 \ +1994 400 4 4 1 \ +1995 700 6 6 1 + +1979 90 1 1 1 \ +1980 50 1 1 1 \ +1981 50 1 1 1 \ +1982 50 2 2 1 \ +1983 170 2 2 1 \ +1984 220 4 4 1 \ +1985 160 1 1 1 \ +1986 130 1 1 1 \ +1987 130 4 4 1 \ +1988 150 4 4 1 \ +1989 195 5 5 1 \ +1990 215 4 4 1 \ +1991 110 3 3 1 \ +1992 340 5 5 1 \ +1993 250 4 4 1 \ +1994 360 5 5 1 \ +1995 500 6 6 1 + +1979 90 1 1 1 \ +1980 70 3 3 1 \ +1981 50 2 2 1 \ +1982 80 3 3 1 \ +1983 270 6 6 1 \ +1984 230 4 4 1 \ +1985 190 5 5 1 \ +1986 110 4 4 1 \ +1987 140 3 3 1 \ +1988 190 4 4 1 \ +1989 310 6 6 1 \ +1990 390 5 5 1 \ +1991 200 4 4 1 \ +1992 470 5 5 1 \ +1993 310 3 3 1 \ +1994 520 5 5 1 \ +1995 750 5 5 1 + +1979 70 3 3 1 \ +1980 70 4 4 1 \ +1981 80 3 3 1 \ +1982 170 4 4 1 \ +1983 460 6 6 1 \ +1984 350 6 6 1 \ +1985 250 3 3 1 \ +1986 180 4 4 1 \ +1987 300 6 6 1 \ +1988 460 6 6 1 \ +1989 540 7 7 1 \ +1990 540 5 5 1 \ +1991 390 5 5 1 \ +1992 620 8 8 1 \ +1993 530 5 5 1 \ +1994 590 7 7 1 \ +1995 740 7 7 1 + +1979 70 4 4 1 \ +1980 70 4 4 1 \ +1981 60 4 4 1 \ +1982 180 5 5 1 \ +1983 420 5 5 1 \ +1984 500 7 7 1 \ +1985 350 5 5 1 \ +1986 360 3 3 1 \ +1987 300 3 3 1 \ +1988 400 5 5 1 \ +1989 570 6 6 1 \ +1990 630 5 5 1 \ +1991 390 5 5 1 \ +1992 620 5 5 1 \ +1993 440 4 4 1 \ +1994 580 4 4 1 \ +1995 830 4 4 1 + +1980 100 2 2 1 \ +1981 80 6 6 1 \ +1982 180 4 4 1 \ +1983 380 6 6 1 \ +1984 310 6 6 1 \ +1985 200 5 5 1 \ +1986 160 5 5 1 \ +1987 220 5 5 1 \ +1988 430 7 7 1 \ +1989 480 8 8 1 \ +1990 440 5 5 1 \ +1991 250 5 5 1 \ +1992 540 8 8 1 \ +1993 450 5 5 1 \ +1994 640 4 4 1 \ +1995 720 7 7 1 + +1979 50 1 1 1 \ +1980 50 3 3 1 \ +1981 60 4 4 1 \ +1982 270 10 10 1 \ +1983 350 8 8 1 \ +1984 410 8 8 1 \ +1985 340 6 6 1 \ +1986 300 6 6 1 \ +1987 300 5 5 1 \ +1988 540 7 7 1 \ +1989 510 7 7 1 \ +1990 530 5 5 1 \ +1991 380 7 7 1 \ +1992 600 5 5 1 \ +1993 520 6 6 1 \ +1994 550 6 6 1 \ +1995 630 7 7 1 + +1979 20 2 2 1 \ +1980 70 2 2 1 \ +1981 60 3 3 1 \ +1982 230 5 5 1 \ +1983 400 5 5 1 \ +1984 400 5 5 1 \ +1985 350 5 5 1 \ +1986 360 5 5 1 \ +1987 330 5 5 1 \ +1988 570 8 8 1 \ +1989 610 7 7 1 \ +1990 460 5 5 1 \ +1991 290 5 5 1 \ +1992 620 5 5 1 \ +1993 560 4 4 1 \ +1994 580 6 6 1 \ +1995 720 5 5 1 + +1980 100 3 3 1 \ +1981 60 3 3 1 \ +1982 210 4 4 1 \ +1983 380 6 6 1 \ +1984 370 6 6 1 \ +1985 280 3 3 1 \ +1986 300 5 5 1 \ +1987 240 4 4 1 \ +1988 400 8 8 1 \ +1989 510 7 7 1 \ +1990 490 5 5 1 \ +1991 350 5 5 1 \ +1992 590 7 7 1 \ +1993 640 4 4 1 \ +1994 500 2 2 1 \ +1995 750 6 6 1 + +1980 130 3 3 1 \ +1981 100 6 6 1 \ +1982 240 5 5 1 \ +1983 330 9 9 1 \ +1984 400 7 7 1 \ +1985 340 7 7 1 \ +1986 260 5 5 1 \ +1987 350 6 6 1 \ +1988 500 8 8 1 \ +1989 530 7 7 1 \ +1990 390 4 4 1 \ +1991 440 5 5 1 \ +1992 640 8 8 1 \ +1993 450 8 8 1 \ +1994 490 7 7 1 \ +1995 470 5 5 1 + +1979 40 1 1 1 \ +1980 60 1 1 1 \ +1981 40 2 2 1 \ +1982 120 5 5 1 \ +1983 275 5 7 2 \ +1984 240 5 5 1 \ +1985 225 5 5 1 \ +1986 190 4 4 1 \ +1987 220 5 5 1 \ +1988 280 6 6 1 \ +1989 330 6 6 1 \ +1990 400 5 5 1 \ +1991 270 4 4 1 \ +1992 530 7 7 1 \ +1993 420 6 6 1 \ +1994 510 6 6 1 \ +1995 590 8 8 1 + +1979 60 1 1 1 \ +1980 90 4 4 1 \ +1981 110 5 5 1 \ +1982 360 6 6 1 \ +1983 400 9 9 1 \ +1984 500 10 10 1 \ +1985 410 7 7 1 \ +1986 290 7 7 1 \ +1987 260 6 6 1 \ +1988 580 10 10 1 \ +1989 660 10 10 1 \ +1990 510 7 7 1 \ +1991 480 8 8 1 \ +1992 720 10 10 1 \ +1993 570 8 8 1 \ +1994 620 6 6 1 \ +1995 730 7 7 1 + +1980 40 1 1 1 \ +1981 40 2 2 1 \ +1982 290 3 3 1 \ +1983 300 5 5 1 \ +1984 350 6 6 1 \ +1985 410 7 7 1 \ +1986 360 3 3 1 \ +1987 460 5 5 1 \ +1988 630 6 6 1 \ +1989 570 3 3 1 \ +1990 610 5 5 1 \ +1991 530 5 5 1 \ +1992 470 5 5 1 \ +1993 650 5 5 1 \ +1994 580 5 5 1 \ +1995 740 7 7 1 + +1979 40 1 1 1 \ +1980 30 2 2 1 \ +1981 80 2 2 1 \ +1982 280 10 10 1 \ +1983 250 6 6 1 \ +1984 290 6 6 1 \ +1985 230 5 5 1 \ +1986 220 4 4 1 \ +1987 190 3 3 1 \ +1988 320 8 8 1 \ +1989 480 6 6 1 \ +1990 430 6 6 1 \ +1991 210 5 5 1 \ +1992 470 4 4 1 \ +1993 430 4 4 1 \ +1994 510 4 4 1 \ +1995 620 5 5 1 + +1979 20 1 1 1 \ +1980 80 3 3 1 \ +1981 70 4 4 1 \ +1982 340 5 9 2 \ +1983 390 3 7 2 \ +1984 280 5 5 1 \ +1985 350 5 5 1 \ +1986 430 5 5 1 \ +1987 420 6 6 1 \ +1988 600 7 7 1 \ +1989 590 5 5 1 \ +1990 520 3 3 1 \ +1991 500 4 4 1 \ +1992 660 5 5 1 \ +1993 550 3 3 1 \ +1994 600 6 6 1 \ +1995 700 6 6 1 + +1979 120 4 4 1 \ +1980 120 4 4 1 \ +1981 80 4 4 1 \ +1982 450 5 8 2 \ +1983 450 3 5 2 \ +1984 340 5 5 1 \ +1985 470 8 8 1 \ +1986 420 4 4 1 \ +1987 400 4 4 1 \ +1988 710 6 6 1 \ +1989 650 5 5 1 \ +1990 430 5 5 1 \ +1991 390 6 6 1 \ +1992 630 7 7 1 \ +1993 475 5 5 1 \ +1994 565 7 7 1 \ +1995 690 7 7 1 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_23.seq b/src/openalea/sequence_analysis/data/pin_laricio_23.seq new file mode 100644 index 0000000..4bcca67 --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_23.seq @@ -0,0 +1,302 @@ +# arbres de 23 ans, parcelle 528 + +# 5 VARIABLES + +# VARIABLE 1 : TIME +# VARIABLE 2 : VALUE longueur de la pousse +# VARIABLE 3 : VALUE nombre de branches par UC inter +# VARIABLE 4 : VALUE nombre de branches totale UC intra et inter +# VARIABLE 5 : VALUE nombre de cycles + +INDEX_PARAMETER : TIME + +4 VARIABLES + +VARIABLE 1 : INT # longueur de la pousse +VARIABLE 2 : INT # nombre de branches par UC inter +VARIABLE 3 : INT # nombre de branches totale UC intra et inter +VARIABLE 4 : INT # nombre de cycles + +1975 70 1 1 1 \ +1976 50 4 4 1 \ +1977 180 3 3 1 \ +1978 310 7 7 1 \ +1979 250 6 6 1 \ +1980 350 8 8 1 \ +1981 520 8 8 1 \ +1982 680 8 8 1 \ +1983 740 8 8 1 \ +1984 630 9 9 1 \ +1985 600 7 7 1 \ +1986 580 5 5 1 \ +1987 500 10 10 1 \ +1988 620 7 7 1 \ +1989 670 8 8 1 \ +1990 590 8 8 1 \ +1991 500 7 7 1 \ +1992 600 9 9 1 \ +1993 630 8 8 1 \ +1994 590 8 8 1 \ +1995 690 8 8 1 + +1975 110 1 1 1 \ +1976 40 1 1 1 \ +1977 230 7 7 1 \ +1978 400 5 5 1 \ +1979 270 4 4 1 \ +1980 210 5 5 1 \ +1981 390 6 6 1 \ +1982 510 7 7 1 \ +1983 670 5 5 1 \ +1984 650 8 8 1 \ +1985 470 5 5 1 \ +1986 410 4 4 1 \ +1987 290 3 3 1 \ +1988 740 7 7 1 \ +1989 610 5 5 1 \ +1990 500 6 6 1 \ +1991 650 5 5 1 \ +1992 780 7 7 1 \ +1993 730 6 6 1 \ +1994 790 6 6 1 \ +1995 800 8 8 1 + +1975 60 3 3 1 \ +1976 110 4 4 1 \ +1977 140 3 3 1 \ +1978 360 4 4 1 \ +1979 150 3 3 1 \ +1980 140 5 5 1 \ +1981 190 5 5 1 \ +1982 290 5 5 1 \ +1983 520 5 5 1 \ +1984 540 6 6 1 \ +1985 430 7 7 1 \ +1986 350 4 4 1 \ +1987 250 5 5 1 \ +1988 540 6 6 1 \ +1989 480 6 6 1 \ +1990 430 5 5 1 \ +1991 400 5 5 1 \ +1992 610 7 7 1 \ +1993 540 5 5 1 \ +1994 660 8 8 1 \ +1995 680 7 7 1 + +1976 140 3 3 1 \ +1977 190 4 4 1 \ +1978 330 7 7 1 \ +1979 300 6 6 1 \ +1980 360 6 6 1 \ +1981 540 8 8 1 \ +1982 730 8 8 1 \ +1983 610 7 7 1 \ +1984 630 8 8 1 \ +1985 470 7 7 1 \ +1986 370 3 3 1 \ +1987 490 5 5 1 \ +1988 740 8 8 1 \ +1989 620 7 7 1 \ +1990 650 7 7 1 \ +1991 480 6 6 1 \ +1992 610 7 7 1 \ +1993 610 6 6 1 \ +1994 630 7 7 1 \ +1995 710 7 7 1 + +1975 60 4 4 1 \ +1976 50 5 5 1 \ +1977 140 4 4 1 \ +1978 80 1 1 1 \ +1979 80 4 4 1 \ +1980 350 3 9 2 \ +1981 230 5 5 1 \ +1982 490 6 6 1 \ +1983 600 7 7 1 \ +1984 720 7 7 1 \ +1985 530 6 6 1 \ +1986 470 5 5 1 \ +1987 450 6 6 1 \ +1988 600 5 5 1 \ +1989 560 6 6 1 \ +1990 540 5 5 1 \ +1991 500 7 7 1 \ +1992 670 5 5 1 \ +1993 570 6 6 1 \ +1994 550 5 5 1 \ +1995 720 7 7 1 + +1976 140 1 1 1 \ +1977 80 1 1 1 \ +1978 320 4 4 1 \ +1979 340 5 5 1 \ +1980 350 6 6 1 \ +1981 590 7 7 1 \ +1982 590 6 6 1 \ +1983 660 7 7 1 \ +1984 660 7 7 1 \ +1985 530 5 5 1 \ +1986 560 5 5 1 \ +1987 470 7 7 1 \ +1988 810 5 5 1 \ +1989 680 6 6 1 \ +1990 540 6 6 1 \ +1991 540 6 6 1 \ +1992 620 8 8 1 \ +1993 610 6 6 1 \ +1994 640 7 7 1 \ +1995 680 8 8 1 + +1975 40 2 2 1 \ +1976 60 3 3 1 \ +1977 130 5 5 1 \ +1978 270 6 6 1 \ +1979 180 5 5 1 \ +1980 230 3 3 1 \ +1981 390 7 7 1 \ +1982 640 8 8 1 \ +1983 670 8 8 1 \ +1984 660 8 8 1 \ +1985 580 6 6 1 \ +1986 540 5 5 1 \ +1987 570 7 7 1 \ +1988 720 7 7 1 \ +1989 670 6 6 1 \ +1990 590 6 6 1 \ +1991 580 5 5 1 \ +1992 700 7 7 1 \ +1993 680 6 6 1 \ +1994 680 7 7 1 \ +1995 700 8 8 1 + +1975 120 4 4 1 \ +1976 50 4 4 1 \ +1977 250 4 7 2 \ +1978 290 4 4 1 \ +1979 290 5 5 1 \ +1980 470 5 5 1 \ +1981 570 5 5 1 \ +1982 640 6 6 1 \ +1983 760 6 6 1 \ +1984 730 6 6 1 \ +1985 630 6 6 1 \ +1986 620 6 6 1 \ +1987 610 5 5 1 \ +1988 760 8 8 1 \ +1989 680 6 6 1 \ +1990 690 8 8 1 \ +1991 540 6 6 1 \ +1992 600 6 6 1 \ +1993 540 6 6 1 \ +1994 630 8 8 1 \ +1995 700 6 6 1 + +1975 60 2 2 1 \ +1976 70 3 3 1 \ +1977 210 5 5 1 \ +1978 340 5 5 1 \ +1979 220 5 5 1 \ +1980 270 6 6 1 \ +1981 360 6 6 1 \ +1982 600 5 5 1 \ +1983 700 7 7 1 \ +1984 650 6 6 1 \ +1985 430 5 5 1 \ +1986 390 3 3 1 \ +1987 280 5 5 1 \ +1988 700 8 8 1 \ +1989 600 5 5 1 \ +1990 390 3 3 1 \ +1991 410 3 3 1 \ +1992 500 5 5 1 \ +1993 600 5 5 1 \ +1994 570 4 4 1 \ +1995 780 5 5 1 + +1975 160 1 1 1 \ +1976 50 1 1 1 \ +1977 80 3 3 1 \ +1978 190 3 3 1 \ +1979 220 4 4 1 \ +1980 260 6 6 1 \ +1981 400 7 7 1 \ +1982 540 6 6 1 \ +1983 650 7 7 1 \ +1984 580 6 6 1 \ +1985 540 7 7 1 \ +1986 490 0 0 1 \ +1987 160 3 3 1 \ +1988 630 9 9 1 \ +1989 610 5 5 1 \ +1990 580 6 6 1 \ +1991 530 5 5 1 \ +1992 600 7 7 1 \ +1993 590 5 5 1 \ +1994 620 6 6 1 \ +1995 700 5 5 1 + +1975 60 5 5 1 \ +1976 70 6 6 1 \ +1977 130 4 4 1 \ +1978 240 4 4 1 \ +1979 340 8 8 1 \ +1980 370 6 6 1 \ +1981 560 8 8 1 \ +1982 570 2 2 1 \ +1983 610 5 5 1 \ +1984 500 7 7 1 \ +1985 450 5 5 1 \ +1986 620 6 6 1 \ +1987 530 5 5 1 \ +1988 850 6 19 2 \ +1989 620 7 7 1 \ +1990 680 7 7 1 \ +1991 630 7 7 1 \ +1992 720 8 8 1 \ +1993 690 6 6 1 \ +1994 730 7 7 1 \ +1995 800 8 8 1 + +1975 90 2 2 1 \ +1976 100 3 3 1 \ +1977 130 3 3 1 \ +1978 340 5 13 2 \ +1979 270 3 3 1 \ +1980 320 5 5 1 \ +1981 440 8 8 1 \ +1982 560 8 8 1 \ +1983 510 8 8 1 \ +1984 560 8 8 1 \ +1985 480 4 4 1 \ +1986 530 5 5 1 \ +1987 480 6 6 1 \ +1988 670 5 5 1 \ +1989 700 7 7 1 \ +1990 610 7 7 1 \ +1991 590 6 6 1 \ +1992 630 6 6 1 \ +1993 590 6 6 1 \ +1994 610 7 7 1 \ +1995 660 6 6 1 + +1975 50 2 2 1 \ +1976 70 2 2 1 \ +1977 120 3 3 1 \ +1978 130 2 2 1 \ +1979 90 4 4 1 \ +1980 180 5 5 1 \ +1981 240 5 5 1 \ +1982 430 7 7 1 \ +1983 570 7 7 1 \ +1984 580 7 7 1 \ +1985 520 6 6 1 \ +1986 500 3 3 1 \ +1987 500 6 6 1 \ +1988 740 6 6 1 \ +1989 570 6 6 1 \ +1990 580 5 5 1 \ +1991 580 6 6 1 \ +1992 630 6 6 1 \ +1993 590 6 6 1 \ +1994 700 7 7 1 \ +1995 410 6 6 1 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_3_gaussian_multivariate.hsc b/src/openalea/sequence_analysis/data/pin_laricio_3_gaussian_multivariate.hsc new file mode 100644 index 0000000..c4797e0 --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_3_gaussian_multivariate.hsc @@ -0,0 +1,49 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +3 STATES + +INITIAL_PROBABILITIES +0.4 0.3 0.3 + +TRANSITION_PROBABILITIES +0.0 0.5 0.5 +0.0 0.0 1.0 +0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.1 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.1 + + +2 OUTPUT_PROCESSES + +OUTPUT_PROCESS 1 : CONTINUOUS_PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +GAUSSIAN MEAN : 5 STANDARD_DEVIATION : 5 +# GAUSSIAN MEAN : 5 STANDARD_DEVIATION : 10 + +STATE 1 OBSERVATION_DISTRIBUTION +GAUSSIAN MEAN : 20 STANDARD_DEVIATION : 10 +# GAUSSIAN MEAN : 30 STANDARD_DEVIATION : 10 + +STATE 2 OBSERVATION_DISTRIBUTION +GAUSSIAN MEAN : 60 STANDARD_DEVIATION : 10 +# GAUSSIAN MEAN : 60 STANDARD_DEVIATION : 10 + + +OUTPUT_PROCESS 2 : DISCRETE_PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +# BINOMIAL INF_BOUND : 0 SUP_BOUND : 15 PROBABILITY : 0.1 +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.5 + +STATE 1 OBSERVATION_DISTRIBUTION +# BINOMIAL INF_BOUND : 0 SUP_BOUND : 15 PROBABILITY : 0.5 +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +# BINOMIAL INF_BOUND : 0 SUP_BOUND : 15 PROBABILITY : 0.9 +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.1 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_6.hsc b/src/openalea/sequence_analysis/data/pin_laricio_6.hsc new file mode 100644 index 0000000..ec6b650 --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_6.hsc @@ -0,0 +1,73 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +6 STATES + +INITIAL_PROBABILITIES +0.2 0.2 0.2 0.2 0.1 0.1 + +TRANSITION_PROBABILITIES +0.0 0.2 0.2 0.2 0.2 0.2 +0.0 0.0 0.3 0.3 0.2 0.2 +0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + + +2 OUTPUT_PROCESSES + +OUTPUT_PROCESS 1 : PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.02 + +STATE 2 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.015 + +STATE 3 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.02 + +STATE 4 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.03 + +STATE 5 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.05 + + +OUTPUT_PROCESS 2 : PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.3 + +STATE 1 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.15 + +STATE 3 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.2 + +STATE 4 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.25 + +STATE 5 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 1 PROBABILITY : 0.3 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_6.seq b/src/openalea/sequence_analysis/data/pin_laricio_6.seq new file mode 100644 index 0000000..cb35848 --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_6.seq @@ -0,0 +1,235 @@ +# arbres de 6 ans, parcelle 60 + +# 5 VARIABLES + +# VARIABLE 1 : TIME +# VARIABLE 2 : VALUE longueur de la pousse +# VARIABLE 3 : VALUE nombre de branches par UC inter +# VARIABLE 4 : VALUE nombre de branches totale UC intra et inter +# VARIABLE 5 : VALUE nombre de cycles + +INDEX_PARAMETER : TIME + +4 VARIABLES + +VARIABLE 1 : INT # longueur de la pousse +VARIABLE 2 : INT # nombre de branches par UC inter +VARIABLE 3 : INT # nombre de branches totale UC intra et inter +VARIABLE 4 : INT # nombre de cycles + +1990 20 1 1 1 \ +1991 30 3 3 1 \ +1992 100 5 5 1 \ +1993 90 5 5 1 \ +1994 260 5 5 1 \ +1995 370 6 6 1 + +1990 5 2 2 1 \ +1991 60 3 3 1 \ +1992 45 5 5 1 \ +1993 125 5 5 1 \ +1994 320 5 5 1 \ +1995 325 6 6 1 + +1990 60 6 6 1 \ +1991 105 5 5 1 \ +1992 95 4 4 1 \ +1993 185 6 6 1 \ +1994 365 7 7 1 \ +1995 670 8 8 1 + +1990 35 1 1 1 \ +1991 60 3 3 1 \ +1992 110 5 5 1 \ +1993 180 9 9 1 \ +1994 335 5 5 1 \ +1995 560 8 8 1 + +1990 50 1 1 1 \ +1991 75 3 3 1 \ +1992 155 8 8 1 \ +1993 230 5 6 2 \ +1994 380 6 6 1 \ +1995 570 8 8 1 + +1990 10 8 8 1 \ +1991 40 4 4 1 \ +1992 40 3 3 1 \ +1993 205 4 4 1 \ +1994 145 3 3 1 \ +1995 170 4 4 1 + +1990 50 2 2 1 \ +1991 85 1 1 1 \ +1992 145 6 6 1 \ +1993 410 9 9 1 \ +1994 430 3 3 1 \ +1995 720 9 9 1 + +1990 5 3 3 1 \ +1991 25 7 7 1 \ +1992 45 6 6 1 \ +1993 85 1 1 1 \ +1994 315 3 11 2 \ +1995 145 5 5 1 + +1990 45 2 2 1 \ +1991 55 3 3 1 \ +1992 65 4 4 1 \ +1993 95 5 5 1 \ +1994 295 5 5 1 \ +1995 250 6 6 1 + +1990 10 2 2 1 \ +1991 90 3 3 1 \ +1992 65 4 4 1 \ +1993 65 4 4 1 \ +1994 315 5 5 1 \ +1995 425 5 5 1 + +1990 20 3 3 1 \ +1991 50 5 5 1 \ +1992 110 6 6 1 \ +1993 205 5 5 1 \ +1994 265 7 7 1 \ +1995 515 6 6 1 + +1990 10 1 1 1 \ +1991 70 2 4 2 \ +1992 135 5 5 1 \ +1993 240 4 4 1 \ +1994 230 4 9 2 \ +1995 425 6 6 1 + +1990 20 1 1 1 \ +1991 50 3 3 1 \ +1992 125 4 4 1 \ +1993 275 5 5 1 \ +1994 415 5 5 1 \ +1995 525 5 5 1 + +1990 60 1 1 1 \ +1991 45 2 2 1 \ +1992 55 3 3 1 \ +1993 180 3 3 1 \ +1994 310 4 4 1 \ +1995 570 6 6 1 + +1990 10 3 3 1 \ +1991 70 4 4 1 \ +1992 80 7 7 1 \ +1993 245 5 5 1 \ +1994 405 6 6 1 \ +1995 485 8 8 1 + +1990 5 1 1 1 \ +1991 105 4 6 2 \ +1992 60 6 6 1 \ +1993 190 4 7 2 \ +1994 250 5 5 1 \ +1995 420 5 5 1 + +1990 45 1 1 1 \ +1991 95 3 3 1 \ +1992 150 7 7 1 \ +1993 260 5 5 1 \ +1994 305 6 6 1 \ +1995 495 8 8 1 + +1990 55 2 2 1 \ +1991 50 4 4 1 \ +1992 145 6 6 1 \ +1993 135 3 3 1 \ +1994 95 3 3 1 \ +1995 440 5 5 1 + +1990 75 2 2 1 \ +1991 65 3 3 1 \ +1992 120 6 6 1 \ +1993 380 6 10 2 \ +1994 365 5 5 1 \ +1995 575 8 8 1 + +1990 10 2 2 1 \ +1991 65 4 4 1 \ +1992 65 8 8 1 \ +1993 350 7 11 2 \ +1994 380 8 13 2 \ +1995 555 4 12 2 + +1990 20 2 2 1 \ +1991 75 5 5 1 \ +1992 90 6 6 1 \ +1993 310 6 6 1 \ +1994 535 7 10 2 \ +1995 515 6 6 1 + +1990 65 3 3 1 \ +1991 30 3 3 1 \ +1992 90 6 6 1 \ +1993 125 4 4 1 \ +1994 35 2 2 1 \ +1995 160 3 5 2 + +1990 25 1 1 1 \ +1991 65 3 3 1 \ +1992 100 6 6 1 \ +1993 300 4 4 1 \ +1994 260 5 5 1 \ +1995 610 8 8 1 + +1990 40 1 1 1 \ +1991 40 3 3 1 \ +1992 75 4 4 1 \ +1993 195 5 5 1 \ +1994 290 5 5 1 \ +1995 470 8 8 1 + +1990 15 2 2 1 \ +1991 95 7 7 1 \ +1992 110 5 5 1 \ +1993 260 6 6 1 \ +1994 450 6 6 1 \ +1995 590 8 8 1 + +1990 10 1 1 1 \ +1991 35 2 2 1 \ +1992 70 6 6 1 \ +1993 225 6 6 1 \ +1994 300 2 7 2 \ +1995 255 5 5 1 + +1990 10 1 1 1 \ +1991 90 5 5 1 \ +1992 110 6 6 1 \ +1993 220 6 6 1 \ +1994 220 6 6 1 \ +1995 390 8 8 1 + +1990 35 1 1 1 \ +1991 55 4 4 1 \ +1992 130 7 7 1 \ +1993 325 6 6 1 \ +1994 405 5 5 1 \ +1995 710 9 9 1 + +1990 10 3 3 1 \ +1991 55 3 3 1 \ +1992 85 4 4 1 \ +1993 190 4 8 2 \ +1994 345 6 6 1 \ +1995 435 6 6 1 + +1990 60 7 10 2 \ +1991 35 5 5 1 \ +1992 50 4 4 1 \ +1993 180 4 9 2 \ +1994 345 8 8 1 \ +1995 580 8 8 1 + +1990 10 1 1 1 \ +1991 85 3 3 1 \ +1992 125 6 6 1 \ +1993 270 6 6 1 \ +1994 310 6 6 1 \ +1995 590 7 7 1 diff --git a/src/openalea/sequence_analysis/data/pin_laricio_7x.seq b/src/openalea/sequence_analysis/data/pin_laricio_7x.seq new file mode 100644 index 0000000..959173c --- /dev/null +++ b/src/openalea/sequence_analysis/data/pin_laricio_7x.seq @@ -0,0 +1,72 @@ +# 3 VARIABLES + +# VARIABLE 1 : TIME +# VARIABLE 2 : VALUE longueur de l'UC +# VARIABLE 3 : VALUE nombre de branches par UC + +INDEX_PARAMETER : TIME + +2 VARIABLES + +VARIABLE 1 : INT # longueur de l'UC +VARIABLE 2 : INT # nombre de branches par UC + +1927 330 7 | 1928 290 8 | 1929 250 6 | 1930 320 5 | 1931 440 5 | 1932 440 7 | 1933 480 4 | 1934 470 6 \ +1935 570 5 | 1936 640 7 | 1937 700 6 | 1938 650 1 | 1939 590 5 | 1940 680 6 | 1941 640 5 | 1942 630 6 \ +1943 530 5 | 1944 540 5 | 1945 670 7 | 1946 750 7 | 1947 530 5 | 1948 820 6 | 1949 590 6 | 1950 650 5 \ +1951 650 6 | 1952 700 6 | 1953 710 5 | 1954 660 6 | 1955 650 5 | 1956 660 4 | 1957 620 4 | 1958 510 5 \ +1959 630 6 | 1960 760 4 | 1961 540 1 | 1962 360 4 | 1963 500 4 | 1964 460 5 | 1965 460 4 | 1966 520 4 \ +1967 610 5 | 1968 560 5 | 1969 550 5 | 1970 540 5 | 1971 560 3 | 1972 380 3 | 1973 350 3 | 1974 450 2 \ +1975 180 4 | 1976 470 5 | 1977 350 5 | 1978 520 2 | 1979 390 5 | 1980 420 5 | 1981 510 5 | 1982 240 0 \ +1983 250 8 | 1984 290 3 | 1985 280 2 | 1986 190 4 | 1987 230 3 | 1988 400 4 | 1989 380 5 | 1990 240 4 \ +1991 180 3 | 1992 210 4 # (1) + +1927 110 1 | 1928 210 3 | 1929 180 3 | 1930 170 4 | 1931 270 4 | 1932 360 6 | 1933 410 5 | 1934 390 6 \ +1935 410 6 | 1936 600 6 | 1937 590 5 | 1938 630 6 | 1939 640 7 | 1940 610 5 | 1941 600 8 | 1942 620 7 \ +1943 650 6 | 1944 680 7 | 1945 710 4 | 1946 830 7 | 1947 660 8 | 1948 870 7 | 1949 630 7 | 1950 520 6 \ +1951 610 6 | 1952 630 7 | 1953 790 5 | 1954 640 6 | 1955 640 6 | 1956 680 7 | 1957 560 5 | 1958 670 8 \ +1959 700 5 | 1960 580 5 | 1961 410 4 | 1962 550 5 | 1963 370 4 | 1964 380 5 | 1965 510 6 | 1966 360 6 \ +1967 610 6 | 1968 490 6 | 1969 470 5 | 1970 610 6 | 1971 450 5 | 1972 370 5 | 1973 380 6 | 1974 400 4 \ +1975 410 4 | 1976 470 4 | 1977 470 5 | 1978 500 4 | 1979 450 5 | 1980 440 6 | 1981 450 5 | 1982 490 5 \ +1983 430 6 | 1984 350 5 | 1985 300 5 | 1986 130 3 | 1987 110 5 | 1988 210 4 | 1989 270 4 | 1990 200 3 \ +1991 90 3 | 1992 160 3 | 1993 110 4 | 1994 150 4 # (2) + +1927 160 4 | 1928 200 5 | 1929 260 3 | 1930 200 4 | 1931 220 4 | 1932 290 5 | 1933 340 5 | 1934 370 1 \ +1935 320 5 | 1936 370 4 | 1937 440 5 | 1938 580 7 | 1939 430 2 | 1940 500 5 | 1941 340 6 | 1942 340 5 \ +1943 440 4 | 1944 380 4 | 1945 320 5 | 1946 430 5 | 1947 350 5 | 1948 490 5 | 1949 520 6 | 1950 500 4 \ +1951 550 5 | 1952 660 5 | 1953 620 5 | 1954 800 5 | 1955 660 5 | 1956 670 6 | 1957 580 7 | 1958 450 6 \ +1959 390 5 | 1960 630 5 | 1961 550 7 | 1962 750 7 | 1963 530 6 | 1964 560 6 | 1965 640 6 | 1966 500 7 \ +1967 570 6 | 1968 540 6 | 1969 530 6 | 1970 640 5 | 1971 490 5 | 1972 640 5 | 1973 420 4 | 1974 520 4 \ +1975 530 6 | 1976 540 5 | 1977 380 3 | 1978 430 4 | 1979 490 6 | 1980 450 4 | 1981 500 7 | 1982 520 5 \ +1983 500 7 | 1984 510 6 | 1985 360 4 | 1986 190 5 | 1987 220 6 | 1988 240 4 | 1989 240 5 | 1990 210 0 \ +1991 130 2 | 1992 130 2 | 1993 110 3 | 1994 130 4 # (3) + +1927 210 4 | 1928 230 6 | 1929 360 5 | 1930 710 6 | 1931 830 6 | 1932 550 6 | 1933 670 6 | 1934 650 8 \ +1935 810 8 | 1936 780 7 | 1937 820 7 | 1938 900 8 | 1939 670 8 | 1940 710 8 | 1941 670 8 | 1942 820 8 \ +1943 820 6 | 1944 640 6 | 1945 570 7 | 1946 680 6 | 1947 520 6 | 1948 600 5 | 1949 530 6 | 1950 560 6 \ +1951 760 6 | 1952 680 8 | 1953 490 6 | 1954 440 4 | 1955 410 5 | 1956 540 4 | 1957 360 6 | 1958 540 5 \ +1959 600 6 | 1960 380 5 | 1961 470 5 | 1962 500 3 | 1963 210 2 | 1964 240 5 | 1965 330 4 | 1966 290 4 \ +1967 430 3 | 1968 250 4 | 1969 430 5 | 1970 450 5 | 1971 410 6 | 1972 360 4 | 1973 310 4 | 1974 420 4 \ +1975 430 5 | 1976 270 4 | 1977 140 2 | 1978 220 4 | 1979 290 4 | 1980 50 4 | 1981 310 4 | 1982 230 4 \ +1983 180 4 | 1984 130 2 | 1985 120 2 | 1986 100 1 | 1987 80 2 | 1988 160 4 | 1989 200 2 | 1990 100 2 \ +1991 110 2 | 1992 190 4 | 1993 140 4 | 1994 260 3 # (4) + +1927 110 3 | 1928 180 4 | 1929 100 5 | 1930 210 6 | 1931 500 9 | 1932 570 8 | 1933 590 9 | 1934 610 10 \ +1935 700 10 | 1936 700 11 | 1937 640 12 | 1938 580 9 | 1939 630 11 | 1940 670 9 | 1941 470 7 | 1942 570 11 \ +1943 740 9 | 1944 610 11 | 1945 660 13 | 1946 670 8 | 1947 500 8 | 1948 550 7 | 1949 540 10 | 1950 490 7 \ +1951 640 8 | 1952 550 9 | 1953 570 7 | 1954 480 7 | 1955 480 9 | 1956 630 7 | 1957 460 10 | 1958 640 9 \ +1959 610 9 | 1960 480 8 | 1961 490 8 | 1962 560 9 | 1963 410 5 | 1964 420 6 | 1965 470 5 | 1966 420 5 \ +1967 540 7 | 1968 420 5 | 1969 540 7 | 1970 480 5 | 1971 530 7 | 1972 520 7 | 1973 390 8 | 1974 480 4 \ +1975 320 3 | 1976 390 6 | 1977 290 4 | 1978 240 3 | 1979 260 5 | 1980 340 5 | 1981 250 4 | 1982 420 7 \ +1983 360 7 | 1984 320 6 | 1985 300 6 | 1986 290 6 | 1987 260 5 | 1988 320 5 | 1989 330 8 | 1990 350 8 \ +1991 120 2 | 1992 190 5 | 1993 260 6 | 1994 270 5 # (5) + +1927 130 2 | 1928 380 5 | 1929 220 5 | 1930 410 5 | 1931 510 7 | 1932 530 5 | 1933 610 5 | 1934 720 8 \ +1935 540 5 | 1936 600 5 | 1937 510 7 | 1938 610 7 | 1939 540 6 | 1940 580 5 | 1941 440 8 | 1942 540 6 \ +1943 470 6 | 1944 480 6 | 1945 450 6 | 1946 510 6 | 1947 360 4 | 1948 470 5 | 1949 380 4 | 1950 350 4 \ +1951 440 5 | 1952 500 5 | 1953 440 4 | 1954 410 4 | 1955 420 5 | 1956 590 6 | 1957 350 5 | 1958 530 4 \ +1959 460 4 | 1960 300 4 | 1961 500 4 | 1962 370 4 | 1963 190 2 | 1964 240 4 | 1965 490 4 | 1966 390 4 \ +1967 520 5 | 1968 490 4 | 1969 500 4 | 1970 570 6 | 1971 410 4 | 1972 500 5 | 1973 370 3 | 1974 420 5 \ +1975 390 4 | 1976 210 4 | 1977 140 1 | 1978 150 4 | 1979 290 4 | 1980 170 4 | 1981 210 3 | 1982 310 4 \ +1983 120 1 | 1984 250 4 | 1985 140 3 | 1986 130 3 | 1987 110 2 | 1988 200 3 | 1989 210 4 | 1990 270 3 \ +1991 130 4 | 1992 180 3 | 1993 150 3 | 1994 280 3 # (6) diff --git a/src/openalea/sequence_analysis/data/reinet1.hsc b/src/openalea/sequence_analysis/data/reinet1.hsc new file mode 100644 index 0000000..a8f2e96 --- /dev/null +++ b/src/openalea/sequence_analysis/data/reinet1.hsc @@ -0,0 +1,78 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +7 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/reinet1.seq b/src/openalea/sequence_analysis/data/reinet1.seq new file mode 100644 index 0000000..d7824c2 --- /dev/null +++ b/src/openalea/sequence_analysis/data/reinet1.seq @@ -0,0 +1,66 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1168 +# mean: 1.24658 variance: 2.28191 standard deviation: 1.5106 + +# | value histogram +# 0 584 latent bud +# 1 176 short shoot +# 2 119 long shoot +# 3 114 fruiting shoot +# 4 175 immediate shoot + +# sequence length histogram - size of the sample: 16 +# mean: 73 variance: 14.2667 standard deviation: 3.77712 + +# cumulative length: 1168 + +0 0 0 2 0 1 0 0 3 0 3 3 3 0 3 3 1 3 3 3 3 0 1 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 \ +0 1 0 0 2 0 2 0 0 2 0 2 0 2 0 2 2 2 1 2 0 2 0 2 1 0 0 0 0 0 0 0 0 0 + +2 2 3 3 3 3 1 3 3 3 3 3 3 3 0 0 0 0 4 4 4 4 4 2 4 4 4 4 0 0 0 0 4 0 0 0 0 0 1 0 1 \ +1 1 2 1 0 2 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + +0 2 2 2 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 \ +0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 3 0 3 3 0 3 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 4 0 0 0 0 \ +0 1 0 1 0 2 2 1 1 0 2 2 2 1 2 2 2 0 0 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 + +0 0 2 0 0 1 0 0 0 0 3 4 4 0 0 2 0 0 0 0 0 3 3 2 4 4 4 4 4 4 4 4 4 4 2 4 4 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 + +0 0 0 2 0 0 0 0 3 3 3 3 3 3 3 0 3 0 3 3 3 3 4 2 4 4 4 4 2 4 4 4 0 0 0 0 0 0 0 0 0 \ +0 2 0 1 1 2 1 0 1 2 1 0 2 1 1 2 1 1 2 0 0 0 2 2 0 2 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 1 0 3 0 3 3 0 0 1 0 3 0 0 0 0 3 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 \ +0 0 0 0 0 0 1 0 0 2 0 0 1 1 1 0 1 1 1 1 0 1 2 0 0 2 0 0 0 0 0 0 0 0 0 + +0 0 2 0 0 0 0 3 0 0 3 0 3 1 0 3 0 3 0 0 3 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 \ +0 0 0 0 0 1 0 1 2 1 0 1 1 0 2 0 2 1 2 2 1 1 1 2 2 1 2 2 0 0 0 0 0 0 0 0 0 0 + +2 2 2 2 2 0 0 1 0 3 3 3 0 3 0 3 3 0 3 3 0 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 \ +0 0 1 2 0 1 0 2 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +2 2 2 1 1 3 3 0 3 0 0 3 0 0 3 0 0 3 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 \ +0 0 1 0 0 1 1 0 0 1 2 1 0 0 1 1 1 0 1 0 1 2 0 0 0 0 0 0 0 + +0 0 2 0 2 0 3 3 3 0 3 3 0 0 3 4 4 4 4 4 4 4 4 4 4 4 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 1 0 1 1 1 2 1 2 0 2 1 1 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 2 0 3 3 0 3 3 3 3 3 3 3 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 4 0 0 0 0 0 0 0 0 \ +0 1 0 0 2 1 0 1 1 2 2 1 2 2 1 2 1 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 2 0 0 0 0 0 0 3 3 3 3 3 3 3 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 4 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 1 0 1 1 0 2 1 1 1 1 1 1 1 2 1 0 2 0 0 0 0 0 0 0 + +2 2 2 3 0 3 3 3 0 3 0 3 3 0 0 3 0 4 4 4 4 4 4 4 4 4 4 0 4 0 0 0 0 0 0 0 0 0 0 0 1 \ +2 1 1 0 1 1 0 2 2 1 2 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 + +2 2 3 0 3 0 0 3 0 3 0 3 0 0 3 0 0 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 2 0 0 \ +0 0 2 1 1 1 1 1 0 0 1 2 2 0 1 0 1 2 0 2 0 0 0 0 0 0 0 + +0 0 0 2 2 2 1 0 0 3 0 3 3 3 3 3 3 3 2 4 4 4 4 4 4 4 4 4 4 0 4 0 0 0 0 0 0 0 0 0 1 \ +0 0 1 1 1 1 0 2 0 1 1 0 1 0 1 1 1 1 0 1 2 0 0 0 2 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/sequences1.seq b/src/openalea/sequence_analysis/data/sequences1.seq new file mode 100644 index 0000000..49376de --- /dev/null +++ b/src/openalea/sequence_analysis/data/sequences1.seq @@ -0,0 +1,7 @@ +1 VARIABLE + +VARIABLE 1 : STATE + +1 0 0 0 1 1 2 0 2 2 2 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 2 2 2 1 + +0 0 0 1 1 0 2 0 2 2 2 1 1 1 1 0 1 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/sequences2.seq b/src/openalea/sequence_analysis/data/sequences2.seq new file mode 100644 index 0000000..5040680 --- /dev/null +++ b/src/openalea/sequence_analysis/data/sequences2.seq @@ -0,0 +1,8 @@ +2 VARIABLES + +VARIABLE 1 : STATE +VARIABLE 2 : STATE + +1 0 | 0 0 | 1 0 | 2 0 | 2 1 | 2 1 | 1 0 | 1 0 | 1 0 | 0 1 | 0 1 | 1 1 | 0 1 | 2 0 | 2 1 + +0 0 | 0 0 | 1 0 | 2 0 | 2 1 | 1 1 | 1 0 | 1 0 | 0 0 | 0 0 diff --git a/src/openalea/sequence_analysis/data/sequences_tutorial.dat b/src/openalea/sequence_analysis/data/sequences_tutorial.dat new file mode 100644 index 0000000..1f2e2f8 --- /dev/null +++ b/src/openalea/sequence_analysis/data/sequences_tutorial.dat @@ -0,0 +1,12 @@ +1 VARIABLE + +VARIABLE 1 : VALUE + +0 0 0 0 0 3 3 0 3 3 0 0 4 1 4 4 0 0 0 2 1 0 3 0 0 0 0 2 0 3 3 0 1 4 3 0 0 0 0 0 0 0 0 0 4 0 4 +0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 3 0 1 0 0 0 0 0 1 0 +0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 4 1 3 4 4 0 0 0 4 4 0 3 0 0 0 0 1 0 2 0 4 4 0 0 0 0 4 0 4 4 0 4 4 0 4 4 0 4 0 0 0 0 0 +0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 3 3 0 0 4 0 4 0 0 0 0 0 4 0 0 0 4 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 4 1 0 3 3 0 4 0 4 0 1 3 2 0 0 +0 0 0 0 0 0 0 0 4 4 0 4 0 3 0 0 0 4 0 0 0 0 0 4 0 1 0 0 0 0 0 0 2 1 1 4 2 0 0 0 0 0 0 0 4 4 0 0 4 0 4 0 0 0 0 4 4 +0 0 0 0 0 0 0 0 0 0 0 3 0 2 0 0 0 0 0 4 0 0 0 0 0 1 0 0 1 0 0 1 0 1 3 3 3 4 0 2 0 2 3 0 0 0 0 0 +0 0 3 0 0 0 +0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/switching_lmm_irred.hsc b/src/openalea/sequence_analysis/data/switching_lmm_irred.hsc new file mode 100644 index 0000000..29b2d97 --- /dev/null +++ b/src/openalea/sequence_analysis/data/switching_lmm_irred.hsc @@ -0,0 +1,34 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +3 STATES + +INITIAL_PROBABILITIES +1 0 0 + +TRANSITION_PROBABILITIES +0 0.8 0.2 +0.4 0 0.6 +0.8 0.2 0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 10 PROBABILITY : 0.8 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 5 PROBABILITY : 0.5 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 2 PROBABILITY : 0.2 + + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : CONTINUOUS_PARAMETRIC + +STATE 0 OBSERVATION_MODEL +LINEAR_MODEL INTERCEPT : 0 SLOPE : 0 STANDARD_DEVIATION : 1 + +STATE 1 OBSERVATION_MODEL +LINEAR_MODEL INTERCEPT : 3 SLOPE : 3 STANDARD_DEVIATION : 40 + +STATE 2 OBSERVATION_MODEL +LINEAR_MODEL INTERCEPT : 6 SLOPE : 6 STANDARD_DEVIATION : 400 diff --git a/src/openalea/sequence_analysis/data/test_align1.a b/src/openalea/sequence_analysis/data/test_align1.a new file mode 100644 index 0000000..347978e --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_align1.a @@ -0,0 +1,11 @@ +1 VARIABLE + +VARIABLE 1 : SYMBOLIC + +5 SYMBOLS + +0 +1 0 +1 1 0 +1 1 1 0 +2 2 2 2 0 diff --git a/src/openalea/sequence_analysis/data/test_compound1.cd b/src/openalea/sequence_analysis/data/test_compound1.cd new file mode 100644 index 0000000..e05a45e --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_compound1.cd @@ -0,0 +1,7 @@ +COMPOUND_DISTRIBUTION + +SUM_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 2 PROBABILITY : 0.5 + +ELEMENTARY_DISTRIBUTION +BINOMIAL INF_BOUND : 2 SUP_BOUND : 5 PROBABILITY : 0.5 \ No newline at end of file diff --git a/src/openalea/sequence_analysis/data/test_convolution1.conv b/src/openalea/sequence_analysis/data/test_convolution1.conv new file mode 100644 index 0000000..8a90a82 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_convolution1.conv @@ -0,0 +1,7 @@ +CONVOLUTION 2 DISTRIBUTIONS + +DISTRIBUTION 1 +BINOMIAL INF_BOUND : 0 SUP_BOUND : 5 PROBABILITY : 0.5 + +DISTRIBUTION 2 +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 10 PROBABILITY : 0.3 diff --git a/src/openalea/sequence_analysis/data/test_hidden_markov.hmc b/src/openalea/sequence_analysis/data/test_hidden_markov.hmc new file mode 100644 index 0000000..f83b1d3 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_hidden_markov.hmc @@ -0,0 +1,109 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 + +TRANSITION_PROBABILITIES +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 + +2 OUTPUT_PROCESSES + +OUTPUT_PROCESS 1 : PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 151 PARAMETER : 4.98621 PROBABILITY : 0.0253079 +# mean: 342.608 variance: 7407.65 standard deviation: 86.0677 + +# state 0 observation histogram - sample size: 16 +# mean: 343 variance: 8093.6 standard deviation: 89.9644 + +STATE 1 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 14 PARAMETER : 5.51595 PROBABILITY : 0.128946 +# mean: 51.2609 variance: 288.921 standard deviation: 16.9977 + +# state 1 observation histogram - sample size: 450 +# mean: 52.6467 variance: 283.013 standard deviation: 16.823 + +STATE 2 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 15.2244 PROBABILITY : 0.296427 +# mean: 36.0955 variance: 120.061 standard deviation: 10.9573 + +# state 2 observation histogram - sample size: 616 +# mean: 37.1331 variance: 103.859 standard deviation: 10.1911 + +STATE 3 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 7.57415 PROBABILITY : 0.313207 +# mean: 16.5791 variance: 52.0408 standard deviation: 7.21393 + +# state 3 observation histogram - sample size: 76 +# mean: 15.3289 variance: 33.8504 standard deviation: 5.81811 + +STATE 4 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 0.417911 PROBABILITY : 0.287116 +# mean: 2.02391 variance: 3.3744 standard deviation: 1.83696 + +# state 4 observation histogram - sample size: 135 +# mean: 1.56296 variance: 1.21802 standard deviation: 1.10364 + +STATE 5 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 17.6102 PROBABILITY : 0.392841 +# mean: 27.1879 variance: 68.2611 standard deviation: 8.26203 + +# state 5 observation histogram - sample size: 841 +# mean: 27.0226 variance: 56.234 standard deviation: 7.49893 + +STATE 6 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 9.43365 PROBABILITY : 0.409779 +# mean: 13.5656 variance: 32.5876 standard deviation: 5.70855 + +# state 6 observation histogram - sample size: 674 +# mean: 12.997 variance: 25.8425 standard deviation: 5.08355 + +STATE 7 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1.81053 PROBABILITY : 0.331155 +# mean: 4.63929 variance: 10.6861 standard deviation: 3.26895 + +# state 7 observation histogram - sample size: 164 +# mean: 4.4939 variance: 9.20855 standard deviation: 3.03456 + +OUTPUT_PROCESS 2 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.944093 +OUTPUT 1 : 0.055907 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.998208 +OUTPUT 1 : 0.001792 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.97642 +OUTPUT 1 : 0.02358 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 diff --git a/src/openalea/sequence_analysis/data/test_hidden_markov_non-parametric1.hmc b/src/openalea/sequence_analysis/data/test_hidden_markov_non-parametric1.hmc new file mode 100644 index 0000000..5c02a32 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_hidden_markov_non-parametric1.hmc @@ -0,0 +1,111 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 + +TRANSITION_PROBABILITIES +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 +0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 + +2 OUTPUT_PROCESSES + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.944093 +OUTPUT 1 : 0.055907 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.998208 +OUTPUT 1 : 0.001792 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.97642 +OUTPUT 1 : 0.02358 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.99999 +OUTPUT 1 : 1e-05 + +OUTPUT_PROCESS 2 : PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 151 PARAMETER : 4.98621 PROBABILITY : 0.0253079 +# mean: 342.608 variance: 7407.65 standard deviation: 86.0677 + +# state 0 observation histogram - sample size: 16 +# mean: 343 variance: 8093.6 standard deviation: 89.9644 + +STATE 1 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 14 PARAMETER : 5.51595 PROBABILITY : 0.128946 +# mean: 51.2609 variance: 288.921 standard deviation: 16.9977 + +# state 1 observation histogram - sample size: 450 +# mean: 52.6467 variance: 283.013 standard deviation: 16.823 + +STATE 2 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 15.2244 PROBABILITY : 0.296427 +# mean: 36.0955 variance: 120.061 standard deviation: 10.9573 + +# state 2 observation histogram - sample size: 616 +# mean: 37.1331 variance: 103.859 standard deviation: 10.1911 + +STATE 3 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 7.57415 PROBABILITY : 0.313207 +# mean: 16.5791 variance: 52.0408 standard deviation: 7.21393 + +# state 3 observation histogram - sample size: 76 +# mean: 15.3289 variance: 33.8504 standard deviation: 5.81811 + +STATE 4 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 0.417911 PROBABILITY : 0.287116 +# mean: 2.02391 variance: 3.3744 standard deviation: 1.83696 + +# state 4 observation histogram - sample size: 135 +# mean: 1.56296 variance: 1.21802 standard deviation: 1.10364 + +STATE 5 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 17.6102 PROBABILITY : 0.392841 +# mean: 27.1879 variance: 68.2611 standard deviation: 8.26203 + +# state 5 observation histogram - sample size: 841 +# mean: 27.0226 variance: 56.234 standard deviation: 7.49893 + +STATE 6 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 0 PARAMETER : 9.43365 PROBABILITY : 0.409779 +# mean: 13.5656 variance: 32.5876 standard deviation: 5.70855 + +# state 6 observation histogram - sample size: 674 +# mean: 12.997 variance: 25.8425 standard deviation: 5.08355 + +STATE 7 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1.81053 PROBABILITY : 0.331155 +# mean: 4.63929 variance: 10.6861 standard deviation: 3.26895 + +# state 7 observation histogram - sample size: 164 +# mean: 4.4939 variance: 9.20855 standard deviation: 3.03456 + + diff --git a/src/openalea/sequence_analysis/data/test_hidden_semi_markov.dat b/src/openalea/sequence_analysis/data/test_hidden_semi_markov.dat new file mode 100644 index 0000000..a83e13c --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_hidden_semi_markov.dat @@ -0,0 +1,89 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 6 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.1 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.3 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.1 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.3 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.1 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/test_hidden_semi_markov_param.dat b/src/openalea/sequence_analysis/data/test_hidden_semi_markov_param.dat new file mode 100644 index 0000000..127f49f --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_hidden_semi_markov_param.dat @@ -0,0 +1,33 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +3 STATES + +INITIAL_PROBABILITIES +1 0 0 + +TRANSITION_PROBABILITIES +0.0 0.8 0.2 +0.2 0.0 0.8 +0.8 0.2 0.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +BINOMIAL INF_BOUND : 10 SUP_BOUND : 20 PROBABILITY : 0.85 + +STATE 1 OCCUPANCY_DISTRIBUTION +POISSON INF_BOUND : 15 PARAMETER : 25 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 20 PARAMETER : 10 PROBABILITY : 0.5 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : PARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +BINOMIAL INF_BOUND : 45 SUP_BOUND : 75 PROBABILITY : 0.25 + +STATE 1 OBSERVATION_DISTRIBUTION +BINOMIAL INF_BOUND : 75 SUP_BOUND : 100 PROBABILITY : 0.85 + +STATE 2 OBSERVATION_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 3 PROBABILITY : 0.2 diff --git a/src/openalea/sequence_analysis/data/test_nonhomogeneous.dat b/src/openalea/sequence_analysis/data/test_nonhomogeneous.dat new file mode 100644 index 0000000..2a3365b --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_nonhomogeneous.dat @@ -0,0 +1,18 @@ +NONHOMOGENEOUS_MARKOV_CHAIN + +2 STATES + +INITIAL_PROBABILITIES +0.97973 0.0202703 + +TRANSITION_PROBABILITIES +0.916226 0.0837743 +0.82235 0.17765 + + +STATE 0 NONHOMOGENEOUS +MONOMOLECULAR FUNCTION PARAMETER 1 : 0.99999 PARAMETER 2 : -0.200483 PARAMETER 3 : 0.0715162 + +STATE 1 HOMOGENEOUS + + diff --git a/src/openalea/sequence_analysis/data/test_param1.p b/src/openalea/sequence_analysis/data/test_param1.p new file mode 100644 index 0000000..a852b74 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_param1.p @@ -0,0 +1,5 @@ +TOP_PARAMETERS + +PROBABILITY : 0.6 +AXILLARY_PROBABILITY : 0.6 +RHYTHM_RATIO : 1.2 diff --git a/src/openalea/sequence_analysis/data/test_semi_markov.dat b/src/openalea/sequence_analysis/data/test_semi_markov.dat new file mode 100644 index 0000000..3310b24 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_semi_markov.dat @@ -0,0 +1,21 @@ +SEMI-MARKOV_CHAIN + +4 STATES + +INITIAL_PROBABILITIES +0.8 0.2 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.6 0.4 0.0 +0.0 0.0 0.7 0.3 +0.0 0.2 0.0 0.8 +0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 2 PARAMETER : 3.2 PROBABILITY : 0.4 + +STATE 1 OCCUPANCY_DISTRIBUTION +BINOMIAL INF_BOUND : 1 SUP_BOUND : 12 PROBABILITY : 0.6 + +STATE 2 OCCUPANCY_DISTRIBUTION +POISSON INF_BOUND : 1 PARAMETER : 5.4 diff --git a/src/openalea/sequence_analysis/data/test_time_events.dat b/src/openalea/sequence_analysis/data/test_time_events.dat new file mode 100644 index 0000000..417c39c --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_time_events.dat @@ -0,0 +1,8 @@ +20 2 1 +20 3 2 +20 4 4 +20 5 12 +20 6 14 +20 7 6 +20 8 2 +20 9 1 diff --git a/src/openalea/sequence_analysis/data/test_top_parameters.dat b/src/openalea/sequence_analysis/data/test_top_parameters.dat new file mode 100644 index 0000000..e942dbb --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_top_parameters.dat @@ -0,0 +1,5 @@ +TOP_PARAMETERS + +PROBABILITY : 0.7 +AXILLARY_PROBABILITY : 0.6 +RHYTHM_RATIO : 0.8 diff --git a/src/openalea/sequence_analysis/data/test_tops1.dat b/src/openalea/sequence_analysis/data/test_tops1.dat new file mode 100644 index 0000000..7664b23 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_tops1.dat @@ -0,0 +1,9 @@ +2 VARIABLES + +VARIABLE 1 : POSITION +VARIABLE 2 : NB_INTERNODE + +10 5 | 12 5 | 13 6 | 13 8 | 15 7 | 20 10 | 22 11 | 23 11 | 27 15 | 30 16 | 31 15 | 32 17 \ +35 16 | 37 18 | 40 19 | 45 + +5 2 | 7 4 | 10 5 | 11 6 | 15 7 | 18 8 | 20 9 | 21 11 | 22 11 | 25 12 | 25 diff --git a/src/openalea/sequence_analysis/data/test_variable_order_markov.dat b/src/openalea/sequence_analysis/data/test_variable_order_markov.dat new file mode 100644 index 0000000..9643314 --- /dev/null +++ b/src/openalea/sequence_analysis/data/test_variable_order_markov.dat @@ -0,0 +1,36 @@ +MARKOV_CHAIN + +5 STATES + +INITIAL_PROBABILITIES +0.6 0.0666666 0.266667 0 0.0666667 + +TRANSITION_PROBABILITIES # memory +# 0.777778 0.111111 0.111111 0 0 0 non-terminal +0.871269 0.031716 0.057835 0.007462 0.031718 0 0 # terminal +0.405405 0.297297 0.216216 0.081082 0 1 0 # terminal +0.622642 0.169811 0.188679 0 0.018868 2 0 # terminal +0.217391 0.217391 0.043478 0.391304 0.130436 3 0 # terminal +0.55814 0 0.046511 0.023255 0.372094 4 0 # terminal +0.24183 0.457516 0.084967 0.169935 0.045752 1 # terminal +0.5 0.150943 0.301887 0.037735 0.009435 2 # terminal +0.261364 0.170455 0.022727 0.386364 0.15909 3 # terminal +0.153571 0.028571 0.007142 0.025 0.785716 4 # terminal + +# recurrent class: states 0 1 2 3 4 + +# memory tree + +# |___0___0 0 +# | |___1 0 +# | |___2 0 +# | |___3 0 +# | |___4 0 +# |___1 +# |___2 +# |___3 +# |___4 + +# 0 1 2 3 4 +# 0 0 0 1 0 2 0 3 0 4 0 + diff --git a/src/openalea/sequence_analysis/data/vanille_m.seq b/src/openalea/sequence_analysis/data/vanille_m.seq new file mode 100644 index 0000000..a50958c --- /dev/null +++ b/src/openalea/sequence_analysis/data/vanille_m.seq @@ -0,0 +1,362 @@ +1 VARIABLE + +VARIABLE 1 : INT # 2 values + +# value histogram - size of the sample : 3899 +# mean : 0.0897666 variance : 0.0817295 standard deviation : 0.285884 + +# | value histogram +# 0 3549 +# 1 350 + +# value 0 recurrence time histogram - size of the sample : 3401 +# mean : 1.10144 variance : 0.132942 standard deviation : 0.364612 + +# value 1 recurrence time histogram - size of the sample : 202 +# mean : 3.32178 variance : 10.1298 standard deviation : 3.18273 + +# value 0 sojourn time histogram - size of the sample : 285 +# mean : 4.48772 variance : 16.9902 standard deviation : 4.12191 + +# final run - value 0 sojourn time histogram - size of the sample : 147 +# mean : 15.4422 variance : 145.057 standard deviation : 12.0439 + +# value 1 sojourn time histogram - size of the sample : 287 +# mean : 1.21254 variance : 0.237884 standard deviation : 0.487734 + +# final run - value 1 sojourn time histogram - size of the sample : 1 +# mean : 2 variance : 0 standard deviation : 0 + +# number of runs of value 0 per sequence histogram - size of the sample : 148 +# mean : 2.91892 variance : 1.70767 standard deviation : 1.30678 + +# number of runs of value 1 per sequence histogram - size of the sample : 148 +# mean : 1.94595 variance : 1.72495 standard deviation : 1.31337 + +# number of occurences of value 0 per sequence histogram - size of the sample : 148 +# mean : 23.9797 variance : 223.612 standard deviation : 14.9537 + +# number of occurences of value 1 per sequence histogram - size of the sample : 148 +# mean : 2.36486 variance : 3.10406 standard deviation : 1.76184 + +# sequence length histogram - size of the sample : 148 +# mean : 26.3446 variance : 245.125 standard deviation : 15.6565 + +# length cumul : 3899 + +0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 \ +0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 + +1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 + +0 0 0 1 1 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 + +0 1 0 0 0 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 0 + +0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 + +0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 1 0 0 0 0 0 + +0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 1 0 0 0 0 0 0 0 0 0 + +0 1 0 1 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 + +0 1 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 + +0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 1 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 0 0 0 + +0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + +0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 + +0 0 0 1 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + +0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + +0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + +0 1 0 1 0 0 0 1 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 1 0 0 + +0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 + +0 0 0 0 1 1 0 0 0 0 0 + +0 0 0 1 0 1 0 1 0 0 0 0 0 + +0 0 1 0 0 0 1 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + +0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 \ +0 0 0 0 0 0 + +1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 + +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + +0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 + +0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + +0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/src/openalea/sequence_analysis/data/well_log_filtered.seq b/src/openalea/sequence_analysis/data/well_log_filtered.seq new file mode 100644 index 0000000..1c6d813 --- /dev/null +++ b/src/openalea/sequence_analysis/data/well_log_filtered.seq @@ -0,0 +1,4060 @@ +# Well-log data; used in Fearnhead and Clifford "On-line Inference for +# Hidden Markov Models via Particle Filters". Measurements of Nuclear-response +# of a well-bore over time. Data from O Ruanaidh, J. J. K. and +# Fitzgerald, W. J. (1996). "Numerical Bayesion Methods Applied to Signal +# Processing". New York: Springer. + +1 VARIABLE + +VARIABLE 1 : REAL + +# 1.3353060e+05 \ +# 1.3711910e+05 \ +# 1.3382050e+05 \ +# 1.3601430e+05 \ +# 1.3375700e+05 \ +# 1.2756550e+05 \ +# 1.2141570e+05 \ +1.1457840e+05 \ +1.0495290e+05 \ +# 1.0271870e+05 \ +# 9.6389020e+04 \ +# 9.1232100e+04 \ +# 9.9749550e+04 \ +# 9.4807340e+04 \ +# 9.3409290e+04 \ +# 9.7200520e+04 \ +# 9.7894880e+04 \ +# 1.0306940e+05 \ +# 1.0219520e+05 \ +1.0978810e+05 \ +1.0769660e+05 \ +1.0977970e+05 \ +1.1177950e+05 \ +1.1052790e+05 \ +1.1023730e+05 \ +1.0885180e+05 \ +1.1256800e+05 \ +1.1499570e+05 \ +# 1.2071490e+05 \ +1.1305060e+05 \ +1.1286510e+05 \ +1.1178960e+05 \ +1.0816080e+05 \ +1.0845440e+05 \ +1.1224750e+05 \ +1.0889830e+05 \ +1.0910570e+05 \ +1.0685390e+05 \ +1.0814610e+05 \ +1.0946570e+05 \ +1.1186480e+05 \ +1.1305060e+05 \ +1.1392470e+05 \ +1.1018690e+05 \ +1.0953450e+05 \ +1.0843670e+05 \ +1.1119330e+05 \ +1.0985310e+05 \ +1.0886350e+05 \ +1.1123210e+05 \ +1.1187640e+05 \ +1.1295450e+05 \ +1.0981610e+05 \ +1.1107040e+05 \ +1.1148400e+05 \ +1.1331190e+05 \ +1.1480290e+05 \ +1.1275970e+05 \ +1.0923310e+05 \ +1.1015830e+05 \ +1.0909400e+05 \ +1.0934200e+05 \ +1.1278370e+05 \ +1.1303060e+05 \ +1.0917270e+05 \ +# 9.8990280e+04 \ +1.0990190e+05 \ +1.0859220e+05 \ +1.1257760e+05 \ +1.1357400e+05 \ +1.1392210e+05 \ +1.0961630e+05 \ +1.1388310e+05 \ +1.1253850e+05 \ +1.1090080e+05 \ +1.1146170e+05 \ +1.1202550e+05 \ +1.0834310e+05 \ +1.0888840e+05 \ +1.1433830e+05 \ +1.1550990e+05 \ +1.1111100e+05 \ +1.1075010e+05 \ +1.1387040e+05 \ +1.1503880e+05 \ +1.1141660e+05 \ +1.1592440e+05 \ +1.1153290e+05 \ +1.1309230e+05 \ +1.1549920e+05 \ +1.1059940e+05 \ +1.0884960e+05 \ +1.1210620e+05 \ +1.1318300e+05 \ +1.1439480e+05 \ +1.1268920e+05 \ +1.1108560e+05 \ +1.1295220e+05 \ +1.1371610e+05 \ +1.1208660e+05 \ +1.1448910e+05 \ +1.1338870e+05 \ +1.1114440e+05 \ +1.1261850e+05 \ +1.1325050e+05 \ +1.0787920e+05 \ +1.0873260e+05 \ +1.1172400e+05 \ +1.1145260e+05 \ +1.1626730e+05 \ +1.1013850e+05 \ +1.1111010e+05 \ +1.0778010e+05 \ +1.1322600e+05 \ +1.1140350e+05 \ +1.1306240e+05 \ +1.1218770e+05 \ +1.1437020e+05 \ +1.1230760e+05 \ +1.0848920e+05 \ +1.1604440e+05 \ +1.1512160e+05 \ +1.1615560e+05 \ +1.0959830e+05 \ +1.1415880e+05 \ +# 1.0724130e+05 \ +1.1287050e+05 \ +1.1596510e+05 \ +1.1439170e+05 \ +1.1016710e+05 \ +1.1083070e+05 \ +1.1570850e+05 \ +1.1293990e+05 \ +1.1384630e+05 \ +1.1556770e+05 \ +1.1376510e+05 \ +1.1480290e+05 \ +1.0908840e+05 \ +1.1122260e+05 \ +1.1453440e+05 \ +1.1271860e+05 \ +1.1240810e+05 \ +1.1647750e+05 \ +1.1507660e+05 \ +1.1073030e+05 \ +1.1057800e+05 \ +1.1368350e+05 \ +1.1148400e+05 \ +1.1342320e+05 \ +1.0891380e+05 \ +1.1556770e+05 \ +1.1236680e+05 \ +1.1453920e+05 \ +1.1370360e+05 \ +1.0882820e+05 \ +1.1703450e+05 \ +1.1257850e+05 \ +1.1208630e+05 \ +# 1.1913280e+05 \ +1.1470190e+05 \ +# 1.0749850e+05 \ +1.1583660e+05 \ +1.1228760e+05 \ +1.1606710e+05 \ +1.1099060e+05 \ +1.0938380e+05 \ +1.1329240e+05 \ +1.0838540e+05 \ +1.1428640e+05 \ +1.1354170e+05 \ +1.1285970e+05 \ +1.1011880e+05 \ +1.1372370e+05 \ +# 1.0563570e+05 \ +1.0983590e+05 \ +1.0933490e+05 \ +1.0910210e+05 \ +1.1523320e+05 \ +1.1071040e+05 \ +1.1271090e+05 \ +1.1387440e+05 \ +1.1387440e+05 \ +1.1036630e+05 \ +1.1355400e+05 \ +1.1355400e+05 \ +1.1500160e+05 \ +1.1109180e+05 \ +# 1.0753590e+05 \ +# 1.0663850e+05 \ +1.1431310e+05 \ +1.1354280e+05 \ +1.1201540e+05 \ +1.1272920e+05 \ +1.1372370e+05 \ +1.1151320e+05 \ +1.1182950e+05 \ +1.1282920e+05 \ +1.1468170e+05 \ +1.1309060e+05 \ +1.1213730e+05 \ +1.1297990e+05 \ +1.1004960e+05 \ +1.1325230e+05 \ +1.1683440e+05 \ +1.1665180e+05 \ +1.0987390e+05 \ +1.1336300e+05 \ +1.0998790e+05 \ +1.1231650e+05 \ +1.0855240e+05 \ +1.1228680e+05 \ +1.1072620e+05 \ +# 1.1840130e+05 \ +1.1415290e+05 \ +1.0963770e+05 \ +1.1218590e+05 \ +1.0925620e+05 \ +1.1405250e+05 \ +1.1070000e+05 \ +1.1308910e+05 \ +1.1001880e+05 \ +1.1367230e+05 \ +1.1129240e+05 \ +1.1337760e+05 \ +1.1277980e+05 \ +1.1363030e+05 \ +1.1375390e+05 \ +1.1391590e+05 \ +1.1311060e+05 \ +1.1537620e+05 \ +1.1004740e+05 \ +1.1235720e+05 \ +1.1384690e+05 \ +1.1005130e+05 \ +1.1175000e+05 \ +1.1537430e+05 \ +1.1206510e+05 \ +1.1035050e+05 \ +1.0888840e+05 \ +1.1181500e+05 \ +1.1485280e+05 \ +1.1296140e+05 \ +1.1551710e+05 \ +1.1372370e+05 \ +1.1421250e+05 \ +1.0995570e+05 \ +1.1552720e+05 \ +1.1145210e+05 \ +1.1151410e+05 \ +1.1380670e+05 \ +1.1380670e+05 \ +1.1063500e+05 \ +1.1400510e+05 \ +1.1301050e+05 \ +1.1055980e+05 \ +1.1015610e+05 \ +1.1314160e+05 \ +1.1529530e+05 \ +1.1031980e+05 \ +1.1337210e+05 \ +1.0894350e+05 \ +1.1131120e+05 \ +1.1594680e+05 \ +1.1472210e+05 \ +1.1590630e+05 \ +1.1631220e+05 \ +1.1270420e+05 \ +1.1520510e+05 \ +1.1110430e+05 \ +1.1260930e+05 \ +1.1413630e+05 \ +1.1667210e+05 \ +1.1314160e+05 \ +1.1551470e+05 \ +1.1174830e+05 \ +1.1339770e+05 \ +1.0821700e+05 \ +1.1595960e+05 \ +1.1405520e+05 \ +1.1232690e+05 \ +1.1209640e+05 \ +1.0922500e+05 \ +1.1362330e+05 \ +1.1171870e+05 \ +1.1098010e+05 \ +1.1220580e+05 \ +1.1421930e+05 \ +1.1541680e+05 \ +1.0937550e+05 \ +1.1080110e+05 \ +1.1117310e+05 \ +1.1177510e+05 \ +1.1094240e+05 \ +1.1154360e+05 \ +1.0895520e+05 \ +1.1236680e+05 \ +1.1124240e+05 \ +1.1198580e+05 \ +1.1217660e+05 \ +1.1056880e+05 \ +1.1154360e+05 \ +1.1503610e+05 \ +1.1288120e+05 \ +1.1357640e+05 \ +1.1267330e+05 \ +1.1432130e+05 \ +1.0698500e+05 \ +1.1339210e+05 \ +1.1258800e+05 \ +1.1170560e+05 \ +1.1513090e+05 \ +1.0781210e+05 \ +1.1203530e+05 \ +1.1339770e+05 \ +1.1258290e+05 \ +1.1578330e+05 \ +1.1430970e+05 \ +1.1542930e+05 \ +1.1176380e+05 \ +1.1125200e+05 \ +1.1195580e+05 \ +1.1354500e+05 \ +1.1013850e+05 \ +1.1142310e+05 \ +1.1123160e+05 \ +1.1050430e+05 \ +1.0803630e+05 \ +1.0923310e+05 \ +1.0991490e+05 \ +1.1372220e+05 \ +1.1300130e+05 \ +1.1109180e+05 \ +1.1223740e+05 \ +1.0971340e+05 \ +1.0662540e+05 \ +1.0784010e+05 \ +1.1108470e+05 \ +1.1151360e+05 \ +1.1186480e+05 \ +1.1185480e+05 \ +1.0955420e+05 \ +1.0839430e+05 \ +1.1174380e+05 \ +1.1174980e+05 \ +1.1146830e+05 \ +1.0969810e+05 \ +1.1082380e+05 \ +1.0976710e+05 \ +1.1408680e+05 \ +1.1213670e+05 \ +1.1595770e+05 \ +1.1337700e+05 \ +1.1165400e+05 \ +1.0792940e+05 \ +1.0942070e+05 \ +# 9.4972870e+04 \ +# 9.8664480e+04 \ +# 9.9972630e+04 \ +# 1.0507330e+05 \ +# 1.0507330e+05 \ +1.1064970e+05 \ +1.1029610e+05 \ +1.0838230e+05 \ +1.0838230e+05 \ +1.0911370e+05 \ +1.1307060e+05 \ +1.0767370e+05 \ +1.1204540e+05 \ +1.1117190e+05 \ +1.0703030e+05 \ +1.1391590e+05 \ +1.1244990e+05 \ +1.1097080e+05 \ +# 1.0520090e+05 \ +1.1236660e+05 \ +1.0910940e+05 \ +1.0955420e+05 \ +1.1087250e+05 \ +1.0956550e+05 \ +1.1254810e+05 \ +1.0947400e+05 \ +1.1196570e+05 \ +1.1392470e+05 \ +1.0797620e+05 \ +1.1175420e+05 \ +1.0787410e+05 \ +1.1119230e+05 \ +1.1209680e+05 \ +# 1.1723820e+05 \ +1.0796250e+05 \ +1.0796250e+05 \ +1.1030930e+05 \ +1.1242780e+05 \ +1.1075160e+05 \ +1.1311170e+05 \ +1.1355750e+05 \ +1.1199000e+05 \ +1.1026060e+05 \ +1.0652110e+05 \ +1.1337210e+05 \ +1.1258890e+05 \ +1.1329240e+05 \ +1.1260800e+05 \ +1.1309980e+05 \ +1.1196570e+05 \ +1.1115130e+05 \ +1.1178520e+05 \ +1.0740110e+05 \ +1.1111100e+05 \ +1.0935590e+05 \ +1.0935590e+05 \ +1.1098950e+05 \ +1.0863450e+05 \ +1.1248810e+05 \ +1.1236760e+05 \ +1.0806500e+05 \ +1.1101670e+05 \ +1.0714230e+05 \ +1.1049910e+05 \ +1.1477700e+05 \ +1.0869340e+05 \ +1.0842150e+05 \ +1.0722100e+05 \ +1.0836270e+05 \ +1.0836270e+05 \ +1.0974440e+05 \ +1.1107130e+05 \ +1.1215630e+05 \ +1.1479090e+05 \ +1.1317210e+05 \ +1.1230700e+05 \ +1.1069850e+05 \ +1.0956550e+05 \ +1.1068510e+05 \ +1.1446900e+05 \ +1.1131160e+05 \ +1.1163430e+05 \ +1.0918920e+05 \ +1.1197570e+05 \ +1.0816360e+05 \ +1.0902940e+05 \ +1.0961200e+05 \ +1.0980490e+05 \ +1.1086110e+05 \ +# 1.0612350e+05 \ +1.1360320e+05 \ +1.1360320e+05 \ +1.1085050e+05 \ +1.1485080e+05 \ +1.1266950e+05 \ +1.1370480e+05 \ +1.1095090e+05 \ +1.1076430e+05 \ +1.1239390e+05 \ +1.1327960e+05 \ +1.1197560e+05 \ +1.1165440e+05 \ +1.1194590e+05 \ +1.1314120e+05 \ +1.1196040e+05 \ +1.0907240e+05 \ +1.1489120e+05 \ +1.1425770e+05 \ +1.1275040e+05 \ +1.1144240e+05 \ +1.1378050e+05 \ +1.1321040e+05 \ +1.1204540e+05 \ +1.1007570e+05 \ +1.1003480e+05 \ +1.1148290e+05 \ +1.1165420e+05 \ +1.1359890e+05 \ +1.1276920e+05 \ +1.1331750e+05 \ +1.1417950e+05 \ +1.1271970e+05 \ +1.0901340e+05 \ +1.0941490e+05 \ +1.1511990e+05 \ +1.1244260e+05 \ +1.1250260e+05 \ +1.0852080e+05 \ +1.0980490e+05 \ +1.1402950e+05 \ +1.1168420e+05 \ +1.1480910e+05 \ +1.1278920e+05 \ +1.1662110e+05 \ +1.0832650e+05 \ +1.1438640e+05 \ +1.1514440e+05 \ +1.1285640e+05 \ +1.1558410e+05 \ +1.1106090e+05 \ +1.1383170e+05 \ +1.1222640e+05 \ +1.1354500e+05 \ +1.0940350e+05 \ +1.0940350e+05 \ +1.0882430e+05 \ +1.0882430e+05 \ +1.1585160e+05 \ +1.1585160e+05 \ +1.1248810e+05 \ +1.1304130e+05 \ +1.1191470e+05 \ +1.1323040e+05 \ +# 1.1786630e+05 \ +1.0830390e+05 \ +1.1107200e+05 \ +1.1525340e+05 \ +1.1413570e+05 \ +1.0962480e+05 \ +1.1102510e+05 \ +1.1240810e+05 \ +# 1.0520170e+05 \ +1.1665480e+05 \ +1.1357640e+05 \ +1.1015850e+05 \ +1.1279860e+05 \ +1.0965980e+05 \ +1.1348480e+05 \ +1.1165410e+05 \ +1.1334290e+05 \ +1.1277040e+05 \ +1.0955420e+05 \ +1.1189460e+05 \ +1.0852850e+05 \ +1.0994340e+05 \ +1.0813640e+05 \ +1.1211680e+05 \ +# 1.1862150e+05 \ +1.1627150e+05 \ +1.1455930e+05 \ +1.1123090e+05 \ +1.1461820e+05 \ +1.1294520e+05 \ +1.1350660e+05 \ +1.1073950e+05 \ +1.1321220e+05 \ +1.1578090e+05 \ +1.0911420e+05 \ +1.1220090e+05 \ +1.1135650e+05 \ +# 1.1836780e+05 \ +1.1114040e+05 \ +1.0975560e+05 \ +1.1372490e+05 \ +1.1174380e+05 \ +1.1610320e+05 \ +1.1200580e+05 \ +1.1349370e+05 \ +1.1369850e+05 \ +1.0843800e+05 \ +1.0870670e+05 \ +1.1233110e+05 \ +# 1.1900170e+05 \ +1.0977530e+05 \ +# 1.1856000e+05 \ +1.1122130e+05 \ +1.1237930e+05 \ +1.1463840e+05 \ +1.1115130e+05 \ +1.1255450e+05 \ +1.1225190e+05 \ +1.1109120e+05 \ +1.0885180e+05 \ +1.0862810e+05 \ +# 1.0723450e+05 \ +# 1.0723450e+05 \ +1.1411850e+05 \ +1.1161310e+05 \ +1.1188470e+05 \ +1.1179500e+05 \ +1.1179500e+05 \ +1.1200580e+05 \ +1.1443210e+05 \ +1.1307220e+05 \ +1.1450100e+05 \ +1.1147210e+05 \ +1.1653500e+05 \ +1.0931190e+05 \ +1.1735550e+05 \ +1.1530020e+05 \ +1.1490010e+05 \ +1.1512900e+05 \ +1.1338310e+05 \ +1.1268900e+05 \ +1.1507660e+05 \ +1.1321400e+05 \ +1.1348480e+05 \ +1.1438840e+05 \ +1.1412710e+05 \ +1.1529990e+05 \ +1.1211730e+05 \ +1.1612560e+05 \ +1.1197570e+05 \ +1.1520210e+05 \ +1.1218590e+05 \ +1.1273040e+05 \ +1.0889630e+05 \ +# 1.1958050e+05 \ +# 1.0803710e+05 \ +1.1188930e+05 \ +# 1.1826630e+05 \ +1.1321770e+05 \ +1.1511060e+05 \ +1.1358230e+05 \ +1.1343430e+05 \ +1.1364690e+05 \ +1.1175380e+05 \ +1.1372740e+05 \ +1.1230700e+05 \ +# 1.0755540e+05 \ +1.1484750e+05 \ +1.1111500e+05 \ +1.1783950e+05 \ +# 1.0753590e+05 \ +1.1524010e+05 \ +1.1562990e+05 \ +1.1634510e+05 \ +1.1235800e+05 \ +1.1329240e+05 \ +1.1329440e+05 \ +1.1082650e+05 \ +1.1025290e+05 \ +1.1628250e+05 \ +1.1090080e+05 \ +1.1751320e+05 \ +1.1251960e+05 \ +1.1251960e+05 \ +1.1561470e+05 \ +1.1561470e+05 \ +1.1211680e+05 \ +1.1211680e+05 \ +1.0950640e+05 \ +1.1266890e+05 \ +1.1797630e+05 \ +1.1345440e+05 \ +1.1277630e+05 \ +1.1329190e+05 \ +1.1250800e+05 \ +1.1526580e+05 \ +1.1245850e+05 \ +1.1484760e+05 \ +1.1330340e+05 \ +1.1188470e+05 \ +1.1362390e+05 \ +1.1042710e+05 \ +1.1394750e+05 \ +1.1308310e+05 \ +1.1199560e+05 \ +1.1559700e+05 \ +1.1271030e+05 \ +1.1516460e+05 \ +1.1171850e+05 \ +1.1069850e+05 \ +1.1387850e+05 \ +1.1283980e+05 \ +1.1456950e+05 \ +1.0961340e+05 \ +1.1332290e+05 \ +1.1785870e+05 \ +1.1238860e+05 \ +1.1345440e+05 \ +1.1087540e+05 \ +1.1206020e+05 \ +1.1374760e+05 \ +1.1421930e+05 \ +1.1169420e+05 \ +1.1520510e+05 \ +1.1520510e+05 \ +1.1427270e+05 \ +1.1593930e+05 \ +1.1736210e+05 \ +1.1380670e+05 \ +1.1727380e+05 \ +1.1723150e+05 \ +1.1313240e+05 \ +1.1431310e+05 \ +1.1603700e+05 \ +1.1684770e+05 \ +1.1592440e+05 \ +1.1648350e+05 \ +1.1531870e+05 \ +1.1440360e+05 \ +1.1557150e+05 \ +1.1445230e+05 \ +1.1155280e+05 \ +1.1375630e+05 \ +# 1.2023730e+05 \ +1.1608850e+05 \ +1.1466980e+05 \ +1.1543700e+05 \ +1.1668990e+05 \ +1.1087970e+05 \ +1.1110060e+05 \ +1.1162290e+05 \ +1.1269970e+05 \ +1.1142640e+05 \ +1.1622660e+05 \ +1.1292590e+05 \ +1.1069850e+05 \ +1.1570850e+05 \ +1.1386040e+05 \ +1.1326330e+05 \ +1.1151370e+05 \ +1.1313520e+05 \ +1.1448100e+05 \ +1.1448100e+05 \ +1.1542780e+05 \ +1.1343660e+05 \ +1.1271030e+05 \ +1.1313340e+05 \ +# 1.0178280e+05 \ +# 9.7932140e+04 \ +# 9.8081630e+04 \ +# 1.0554250e+05 \ +1.1131160e+05 \ +1.1236600e+05 \ +1.1158940e+05 \ +1.0946570e+05 \ +1.1566020e+05 \ +1.1302510e+05 \ +1.1344120e+05 \ +1.1043970e+05 \ +1.1495980e+05 \ +1.0862450e+05 \ +1.0985560e+05 \ +1.1246780e+05 \ +1.1417050e+05 \ +1.0841390e+05 \ +1.1200990e+05 \ +1.1190450e+05 \ +1.0970490e+05 \ +1.0981610e+05 \ +1.1065740e+05 \ +1.1585680e+05 \ +1.1019780e+05 \ +1.1421250e+05 \ +1.1015140e+05 \ +1.1349730e+05 \ +1.1242260e+05 \ +1.0971610e+05 \ +1.0781190e+05 \ +1.1227730e+05 \ +1.1120270e+05 \ +1.0867920e+05 \ +1.1143220e+05 \ +1.1073180e+05 \ +1.1053700e+05 \ +1.1033570e+05 \ +1.0864610e+05 \ +1.0826350e+05 \ +1.1104100e+05 \ +1.1087170e+05 \ +1.0794300e+05 \ +1.0801020e+05 \ +1.1052790e+05 \ +1.1560470e+05 \ +1.1169420e+05 \ +1.1319210e+05 \ +1.1293060e+05 \ +1.1150780e+05 \ +1.1269970e+05 \ +1.1285160e+05 \ +1.0708980e+05 \ +1.1087170e+05 \ +1.1317350e+05 \ +1.1442030e+05 \ +1.1535930e+05 \ +1.1535930e+05 \ +1.1323780e+05 \ +1.0824670e+05 \ +1.0757670e+05 \ +1.0824390e+05 \ +1.1068020e+05 \ +1.0803710e+05 \ +1.0648800e+05 \ +1.1211640e+05 \ +1.0903380e+05 \ +1.0902210e+05 \ +1.1292380e+05 \ +1.0835820e+05 \ +1.1295220e+05 \ +1.0933880e+05 \ +1.1402520e+05 \ +1.0970920e+05 \ +1.1408610e+05 \ +1.1312150e+05 \ +1.1116030e+05 \ +1.1539650e+05 \ +1.1380670e+05 \ +1.1592390e+05 \ +1.0853280e+05 \ +1.1143190e+05 \ +1.1258940e+05 \ +1.1357400e+05 \ +1.1305220e+05 \ +1.1505410e+05 \ +1.0973590e+05 \ +1.1037160e+05 \ +1.1054350e+05 \ +1.1337400e+05 \ +1.1491620e+05 \ +1.1007570e+05 \ +1.1223680e+05 \ +1.1152340e+05 \ +1.1452120e+05 \ +1.1168420e+05 \ +1.1567790e+05 \ +1.1032860e+05 \ +1.1117600e+05 \ +1.0976410e+05 \ +1.1674930e+05 \ +1.1356510e+05 \ +1.1327430e+05 \ +1.0951180e+05 \ +1.1250800e+05 \ +1.1113000e+05 \ +1.1291050e+05 \ +1.1545860e+05 \ +1.1448910e+05 \ +1.1153290e+05 \ +1.1243850e+05 \ +1.1448440e+05 \ +1.1342320e+05 \ +1.1470190e+05 \ +1.1373620e+05 \ +1.1146230e+05 \ +1.1157470e+05 \ +1.1312700e+05 \ +1.1533580e+05 \ +1.1168400e+05 \ +1.1114650e+05 \ +1.1282500e+05 \ +1.1363570e+05 \ +1.1477460e+05 \ +1.1113000e+05 \ +1.1406830e+05 \ +1.1305060e+05 \ +1.1081880e+05 \ +1.1361550e+05 \ +1.1501450e+05 \ +1.1501450e+05 \ +1.1494480e+05 \ +1.1250800e+05 \ +1.1181500e+05 \ +1.1413860e+05 \ +1.1446450e+05 \ +1.1462730e+05 \ +1.1205740e+05 \ +1.1104100e+05 \ +1.1388580e+05 \ +1.1577340e+05 \ +1.1541680e+05 \ +1.1329240e+05 \ +1.1617150e+05 \ +1.1266950e+05 \ +1.1306300e+05 \ +1.1293990e+05 \ +1.1054770e+05 \ +1.1265070e+05 \ +1.1655920e+05 \ +1.1516460e+05 \ +1.1382950e+05 \ +1.1182500e+05 \ +1.1189920e+05 \ +1.1330340e+05 \ +1.1312250e+05 \ +1.1030690e+05 \ +1.1277100e+05 \ +1.1162450e+05 \ +1.1265350e+05 \ +1.1392060e+05 \ +1.1330100e+05 \ +1.1095920e+05 \ +1.1635290e+05 \ +1.1319360e+05 \ +1.1262940e+05 \ +1.1621930e+05 \ +1.1049740e+05 \ +1.1515110e+05 \ +1.1417210e+05 \ +1.1660000e+05 \ +1.1315200e+05 \ +1.1260000e+05 \ +1.1540900e+05 \ +1.1517690e+05 \ +1.1113120e+05 \ +1.1205590e+05 \ +# 1.1848510e+05 \ +1.1726550e+05 \ +1.1828090e+05 \ +1.1439520e+05 \ +1.1256940e+05 \ +1.1167840e+05 \ +1.1304670e+05 \ +1.1304670e+05 \ +1.1024320e+05 \ +1.1619180e+05 \ +1.1285050e+05 \ +1.1014730e+05 \ +1.1467600e+05 \ +# 1.1935550e+05 \ +1.1467600e+05 \ +1.1482720e+05 \ +1.1232760e+05 \ +1.1348710e+05 \ +1.1643360e+05 \ +1.1286720e+05 \ +1.1467600e+05 \ +1.1397690e+05 \ +1.1252990e+05 \ +1.1611050e+05 \ +# 1.0870100e+05 \ +1.1459510e+05 \ +1.1104100e+05 \ +1.1101890e+05 \ +1.1294130e+05 \ +1.1849980e+05 \ +1.1624700e+05 \ +1.1525250e+05 \ +1.1478270e+05 \ +1.0994340e+05 \ +1.1017590e+05 \ +1.1643270e+05 \ +1.1077230e+05 \ +1.1474090e+05 \ +1.1438000e+05 \ +1.1785800e+05 \ +1.1438240e+05 \ +1.1230760e+05 \ +1.1230760e+05 \ +1.1340310e+05 \ +1.1387770e+05 \ +1.1632840e+05 \ +1.1449270e+05 \ +1.1701930e+05 \ +1.1656250e+05 \ +1.1098400e+05 \ +1.1129060e+05 \ +1.1746850e+05 \ +1.0997320e+05 \ +1.1356760e+05 \ +1.1765930e+05 \ +1.1504840e+05 \ +1.1837050e+05 \ +1.1178380e+05 \ +1.1299580e+05 \ +1.1508240e+05 \ +1.1338510e+05 \ +1.1376640e+05 \ +1.1052790e+05 \ +1.1670330e+05 \ +1.1311230e+05 \ +1.1365580e+05 \ +1.1444050e+05 \ +1.1232760e+05 \ +1.1251960e+05 \ +1.1807410e+05 \ +1.1838240e+05 \ +1.1155340e+05 \ +1.1552720e+05 \ +1.1449270e+05 \ +1.1277980e+05 \ +1.1673760e+05 \ +1.1224830e+05 \ +1.1581150e+05 \ +1.1517690e+05 \ +1.1321710e+05 \ +1.1604260e+05 \ +1.1086790e+05 \ +1.1641940e+05 \ +1.1378650e+05 \ +1.1403160e+05 \ +1.1786420e+05 \ +1.0863220e+05 \ +1.1509160e+05 \ +1.1620620e+05 \ +1.0982220e+05 \ +1.0902740e+05 \ +1.1087040e+05 \ +1.1021550e+05 \ +1.1327230e+05 \ +1.1327230e+05 \ +1.1281050e+05 \ +1.1586750e+05 \ +1.1290360e+05 \ +1.1421740e+05 \ +1.1169860e+05 \ +1.1175380e+05 \ +1.1501060e+05 \ +1.1546110e+05 \ +1.1490530e+05 \ +1.1442280e+05 \ +1.1001640e+05 \ +1.1065880e+05 \ +1.1337980e+05 \ +1.1320960e+05 \ +1.1680190e+05 \ +1.1283980e+05 \ +1.1480690e+05 \ +1.1292130e+05 \ +1.1063620e+05 \ +1.1268010e+05 \ +1.0969650e+05 \ +1.0878680e+05 \ +1.0983590e+05 \ +# 1.1938150e+05 \ +1.1230700e+05 \ +1.1608290e+05 \ +1.1121100e+05 \ +1.1302670e+05 \ +1.0973620e+05 \ +1.0999550e+05 \ +1.1285310e+05 \ +1.1222700e+05 \ +# 1.1666950e+05 \ +1.1387310e+05 \ +1.1448740e+05 \ +# 1.1609790e+05 \ +1.1169400e+05 \ +1.1051720e+05 \ +# 1.1650630e+05 \ +1.0822710e+05 \ +1.1352280e+05 \ +1.1426090e+05 \ +# 1.1619040e+05 \ +1.1107040e+05 \ +1.1172390e+05 \ +1.1078840e+05 \ +1.1277040e+05 \ +1.0859650e+05 \ +1.0828430e+05 \ +1.0758030e+05 \ +1.1079780e+05 \ +1.0675920e+05 \ +1.0620650e+05 \ +1.0758200e+05 \ +1.0733220e+05 \ +1.0653950e+05 \ +1.0745060e+05 \ +# 1.0514830e+05 \ +# 1.0504560e+05 \ +# 1.0237260e+05 \ +# 1.0290360e+05 \ +1.0599090e+05 \ +# 1.0392340e+05 \ +# 1.0398660e+05 \ +# 1.0518230e+05 \ +# 1.0568330e+05 \ +# 1.0257700e+05 \ +# 1.0530780e+05 \ +# 1.0530780e+05 \ +1.0673880e+05 \ +1.0673880e+05 \ +# 1.0054990e+05 \ +# 1.0054990e+05 \ +# 1.0043940e+05 \ +# 1.0327160e+05 \ +# 1.0241080e+05 \ +1.0757810e+05 \ +# 1.0594600e+05 \ +# 1.0554300e+05 \ +# 1.0586250e+05 \ +# 1.0508550e+05 \ +# 1.0916430e+05 \ +1.1185510e+05 \ +1.2209590e+05 \ +1.2132380e+05 \ +1.2608250e+05 \ +1.2870370e+05 \ +1.2540630e+05 \ +1.2679520e+05 \ +1.2818660e+05 \ +1.2747960e+05 \ +1.2868980e+05 \ +1.3092340e+05 \ +# 1.3163610e+05 \ +1.2822290e+05 \ +1.2748640e+05 \ +1.3092120e+05 \ +1.2934190e+05 \ +1.2938330e+05 \ +1.2811170e+05 \ +1.2871140e+05 \ +1.2245050e+05 \ +1.2649040e+05 \ +1.2605460e+05 \ +1.3117320e+05 \ +1.3124120e+05 \ +1.2954730e+05 \ +1.3141500e+05 \ +1.2800200e+05 \ +1.2896810e+05 \ +# 1.3346090e+05 \ +1.2890590e+05 \ +1.2456190e+05 \ +1.2808970e+05 \ +1.3037580e+05 \ +1.2883940e+05 \ +1.3059430e+05 \ +1.2588180e+05 \ +1.2816560e+05 \ +1.3033430e+05 \ +1.2655480e+05 \ +1.2575330e+05 \ +1.2802460e+05 \ +1.2678440e+05 \ +1.2901260e+05 \ +1.2996230e+05 \ +1.2682790e+05 \ +1.2715320e+05 \ +1.2744330e+05 \ +1.2854230e+05 \ +1.2910340e+05 \ +1.2855810e+05 \ +1.2715320e+05 \ +1.2900770e+05 \ +1.2734270e+05 \ +1.2418820e+05 \ +1.3016740e+05 \ +1.2635860e+05 \ +1.2687660e+05 \ +1.2843270e+05 \ +1.2843270e+05 \ +1.3085780e+05 \ +1.2661870e+05 \ +1.2661870e+05 \ +1.2780610e+05 \ +1.3029260e+05 \ +1.2884010e+05 \ +1.2398900e+05 \ +1.2467440e+05 \ +1.2823000e+05 \ +1.2831840e+05 \ +1.2829600e+05 \ +1.2390490e+05 \ +1.2784350e+05 \ +1.2425190e+05 \ +1.2618470e+05 \ +1.2956240e+05 \ +1.3033000e+05 \ +# 1.3346450e+05 \ +1.2755270e+05 \ +1.2725180e+05 \ +1.3273170e+05 \ +1.3096870e+05 \ +1.2989110e+05 \ +1.2903960e+05 \ +1.2536640e+05 \ +1.2758890e+05 \ +1.3288440e+05 \ +1.2806840e+05 \ +1.2701140e+05 \ +1.2798040e+05 \ +1.2827360e+05 \ +1.2791560e+05 \ +1.2776290e+05 \ +1.2442150e+05 \ +1.3103440e+05 \ +1.3222830e+05 \ +1.2801950e+05 \ +1.2985330e+05 \ +1.2783500e+05 \ +1.2651110e+05 \ +1.2806870e+05 \ +1.2829530e+05 \ +1.3042170e+05 \ +1.2836120e+05 \ +1.2347040e+05 \ +1.2972400e+05 \ +1.2972400e+05 \ +1.2808970e+05 \ +1.2936260e+05 \ +1.2853580e+05 \ +1.2754430e+05 \ +1.2730550e+05 \ +1.2995510e+05 \ +1.2588070e+05 \ +1.2333570e+05 \ +1.2512200e+05 \ +1.2860080e+05 \ +# 1.2257500e+05 \ +1.2781750e+05 \ +1.2551440e+05 \ +1.2536450e+05 \ +1.2431440e+05 \ +1.2691520e+05 \ +1.2923280e+05 \ +1.2657560e+05 \ +# 1.3309500e+05 \ +# 1.2235460e+05 \ +1.2817730e+05 \ +1.3119070e+05 \ +1.2824270e+05 \ +1.2471700e+05 \ +1.3177720e+05 \ +1.2784970e+05 \ +1.3087330e+05 \ +1.3125530e+05 \ +1.2426900e+05 \ +1.3102650e+05 \ +1.2685160e+05 \ +1.2740010e+05 \ +1.2622760e+05 \ +1.2642370e+05 \ +1.2657620e+05 \ +# 1.1938650e+05 \ +# 1.1378500e+05 \ +# 9.0702050e+04 \ +# 7.7599840e+04 \ +# 7.0363290e+04 \ +# 6.8337190e+04 \ +# 6.9196950e+04 \ +# 8.4798660e+04 \ +# 8.4798660e+04 \ +# 9.9172590e+04 \ +# 1.1636820e+05 \ +1.2532930e+05 \ +1.2532930e+05 \ +1.2650430e+05 \ +1.2926140e+05 \ +1.2839720e+05 \ +1.2967410e+05 \ +1.2758140e+05 \ +1.2526090e+05 \ +1.2989840e+05 \ +1.2789390e+05 \ +1.2877510e+05 \ +1.2813370e+05 \ +# 1.3544590e+05 \ +1.2960480e+05 \ +1.2715290e+05 \ +1.3099060e+05 \ +1.2750120e+05 \ +1.2426410e+05 \ +1.2885810e+05 \ +1.2547620e+05 \ +1.3012930e+05 \ +1.2530800e+05 \ +1.3119290e+05 \ +1.2400660e+05 \ +# 1.3237820e+05 \ +1.2454530e+05 \ +1.2491510e+05 \ +1.2685660e+05 \ +1.2578240e+05 \ +1.3044830e+05 \ +1.3030920e+05 \ +1.2448550e+05 \ +1.2627540e+05 \ +1.2855810e+05 \ +1.3216240e+05 \ +1.2798040e+05 \ +1.2747970e+05 \ +1.2594600e+05 \ +1.2732760e+05 \ +1.3202010e+05 \ +1.2741500e+05 \ +1.3174240e+05 \ +1.2549890e+05 \ +1.2903680e+05 \ +1.3076880e+05 \ +1.2579280e+05 \ +1.2503200e+05 \ +1.2521530e+05 \ +1.2912420e+05 \ +1.3189900e+05 \ +1.2709540e+05 \ +1.2803450e+05 \ +1.2787220e+05 \ +1.2800200e+05 \ +1.2952440e+05 \ +1.2537340e+05 \ +1.3257910e+05 \ +1.2694640e+05 \ +1.2680580e+05 \ +1.2659980e+05 \ +1.2435050e+05 \ +1.2888430e+05 \ +1.2613940e+05 \ +1.3018350e+05 \ +1.2455810e+05 \ +1.2455810e+05 \ +1.2812690e+05 \ +1.2812690e+05 \ +1.2785050e+05 \ +1.2522120e+05 \ +1.3271280e+05 \ +1.2812880e+05 \ +1.2851410e+05 \ +1.2918940e+05 \ +# 1.3498410e+05 \ +1.2793690e+05 \ +1.2696870e+05 \ +1.2488900e+05 \ +1.2743630e+05 \ +1.3304060e+05 \ +1.2694720e+05 \ +1.3109090e+05 \ +1.3013510e+05 \ +1.3085750e+05 \ +1.3015840e+05 \ +1.3138600e+05 \ +1.2866670e+05 \ +1.3204500e+05 \ +1.2873040e+05 \ +# 1.3415010e+05 \ +1.2877590e+05 \ +1.3238240e+05 \ +1.3033430e+05 \ +1.2616410e+05 \ +1.2855750e+05 \ +1.3233550e+05 \ +1.2416260e+05 \ +1.3202710e+05 \ +1.2969320e+05 \ +1.2769690e+05 \ +1.3072510e+05 \ +1.2871780e+05 \ +1.2769380e+05 \ +1.3126010e+05 \ +1.3018020e+05 \ +1.2879900e+05 \ +1.2915930e+05 \ +1.2868840e+05 \ +1.2726280e+05 \ +1.3055070e+05 \ +1.2771990e+05 \ +1.2732740e+05 \ +1.2474800e+05 \ +1.2476760e+05 \ +1.2635720e+05 \ +1.2875410e+05 \ +1.2853580e+05 \ +1.2945100e+05 \ +1.2789390e+05 \ +1.2972270e+05 \ +1.2653260e+05 \ +1.2908030e+05 \ +1.2857980e+05 \ +1.2912510e+05 \ +1.3125780e+05 \ +1.2580030e+05 \ +1.2666490e+05 \ +1.2695770e+05 \ +1.3132580e+05 \ +1.2756740e+05 \ +1.2853640e+05 \ +1.2594500e+05 \ +1.2846990e+05 \ +1.2666310e+05 \ +1.2666310e+05 \ +1.2663270e+05 \ +1.2903590e+05 \ +1.2716380e+05 \ +1.2761050e+05 \ +1.3108350e+05 \ +1.2629200e+05 \ +1.2525950e+05 \ +1.2551900e+05 \ +1.2448400e+05 \ +1.2959920e+05 \ +1.3068970e+05 \ +1.2921010e+05 \ +1.2564380e+05 \ +1.2438650e+05 \ +1.2338210e+05 \ +1.2495780e+05 \ +1.2334200e+05 \ +1.2473660e+05 \ +1.2629500e+05 \ +1.2569680e+05 \ +1.2637630e+05 \ +1.2232540e+05 \ +1.2685970e+05 \ +1.2711010e+05 \ +1.2444620e+05 \ +1.2450260e+05 \ +1.2721950e+05 \ +1.2459170e+05 \ +# 1.2104360e+05 \ +1.2666360e+05 \ +1.2782340e+05 \ +1.3034360e+05 \ +1.2374550e+05 \ +1.2415460e+05 \ +1.2640230e+05 \ +1.2437180e+05 \ +1.2476110e+05 \ +1.2581850e+05 \ +1.2644450e+05 \ +1.2735050e+05 \ +1.2849100e+05 \ +1.2566530e+05 \ +1.2688120e+05 \ +1.2965720e+05 \ +1.2903680e+05 \ +1.2564260e+05 \ +1.2780620e+05 \ +1.2829530e+05 \ +1.2433240e+05 \ +1.2463930e+05 \ +1.2767070e+05 \ +1.2360430e+05 \ +1.2498240e+05 \ +1.2228480e+05 \ +1.2408890e+05 \ +1.2408890e+05 \ +1.2872430e+05 \ +1.2619840e+05 \ +1.2503840e+05 \ +1.2675220e+05 \ +1.2166050e+05 \ +1.2966570e+05 \ +1.2668060e+05 \ +1.2782780e+05 \ +1.2382840e+05 \ +1.2435760e+05 \ +1.2631810e+05 \ +1.2151710e+05 \ +# 1.2055060e+05 \ +1.2093750e+05 \ +# 1.0847690e+05 \ +# 9.3351330e+04 \ +# 8.6079190e+04 \ +# 9.3725880e+04 \ +# 1.1127180e+05 \ +# 1.1988900e+05 \ +1.2711170e+05 \ +1.2289390e+05 \ +1.2302360e+05 \ +1.2158640e+05 \ +1.2978660e+05 \ +1.2569300e+05 \ +1.2681120e+05 \ +1.2392850e+05 \ +1.2724080e+05 \ +1.2726210e+05 \ +1.2696800e+05 \ +1.2643250e+05 \ +1.2661700e+05 \ +1.2758890e+05 \ +1.2573620e+05 \ +1.2541070e+05 \ +1.2517110e+05 \ +1.2517110e+05 \ +1.2767550e+05 \ +1.2493320e+05 \ +1.2370950e+05 \ +1.3063610e+05 \ +1.2552030e+05 \ +1.2753810e+05 \ +1.2887220e+05 \ +1.2200540e+05 \ +1.2700660e+05 \ +1.2614910e+05 \ +1.2599700e+05 \ +1.2365680e+05 \ +1.2222120e+05 \ +1.2670620e+05 \ +1.2319160e+05 \ +1.3046900e+05 \ +1.2795930e+05 \ +1.2949690e+05 \ +1.2787180e+05 \ +1.2752960e+05 \ +1.3092330e+05 \ +1.3022110e+05 \ +1.2488750e+05 \ +1.2565130e+05 \ +1.2272310e+05 \ +1.2813410e+05 \ +1.2532090e+05 \ +# 1.2158640e+05 \ +1.2690220e+05 \ +1.2536510e+05 \ +1.2819920e+05 \ +1.2565020e+05 \ +1.2849310e+05 \ +1.2681490e+05 \ +1.2975870e+05 \ +1.2384970e+05 \ +1.2677030e+05 \ +1.2655290e+05 \ +1.2864630e+05 \ +1.2481150e+05 \ +1.2435560e+05 \ +1.2614910e+05 \ +1.2759600e+05 \ +1.2920910e+05 \ +1.2518460e+05 \ +1.2518970e+05 \ +1.2580060e+05 \ +1.2895110e+05 \ +1.2562640e+05 \ +1.2602010e+05 \ +1.2715930e+05 \ +1.2644330e+05 \ +1.2715290e+05 \ +1.2705380e+05 \ +1.2666310e+05 \ +1.2742460e+05 \ +1.2650930e+05 \ +1.2778480e+05 \ +1.2986930e+05 \ +1.2884170e+05 \ +1.2560730e+05 \ +1.2712070e+05 \ +1.2877660e+05 \ +1.2720700e+05 \ +1.2600200e+05 \ +1.2383290e+05 \ +1.2383290e+05 \ +1.2489390e+05 \ +# 1.2114240e+05 \ +# 1.2142780e+05 \ +# 1.2142780e+05 \ +1.2433430e+05 \ +1.2535110e+05 \ +1.2945680e+05 \ +1.2584160e+05 \ +1.2762220e+05 \ +1.3161410e+05 \ +1.3152720e+05 \ +# 1.3611750e+05 \ +1.3352810e+05 \ +1.3628440e+05 \ +1.3161280e+05 \ +1.3412450e+05 \ +1.3325940e+05 \ +1.3529780e+05 \ +1.2923490e+05 \ +1.3639160e+05 \ +1.3128200e+05 \ +1.3516650e+05 \ +1.3375400e+05 \ +1.2897380e+05 \ +1.3214020e+05 \ +1.3372930e+05 \ +1.3384590e+05 \ +1.3590300e+05 \ +1.3566730e+05 \ +1.3710470e+05 \ +1.3305060e+05 \ +1.3328870e+05 \ +# 1.4040850e+05 \ +1.3334450e+05 \ +1.3569070e+05 \ +1.3335570e+05 \ +1.3451280e+05 \ +1.3866460e+05 \ +1.3620300e+05 \ +1.3290950e+05 \ +1.3360780e+05 \ +1.3598900e+05 \ +1.3514900e+05 \ +1.3790530e+05 \ +1.3370330e+05 \ +1.3612360e+05 \ +1.3859160e+05 \ +1.3568110e+05 \ +1.3168530e+05 \ +1.3526230e+05 \ +1.3382370e+05 \ +1.3068910e+05 \ +1.3944770e+05 \ +1.3388640e+05 \ +1.3586340e+05 \ +1.3253150e+05 \ +1.3093190e+05 \ +1.3774830e+05 \ +1.3505290e+05 \ +1.3687340e+05 \ +1.3430720e+05 \ +1.3355110e+05 \ +1.3788270e+05 \ +1.3644870e+05 \ +1.3346390e+05 \ +1.3583050e+05 \ +1.3315020e+05 \ +1.3422510e+05 \ +1.3615150e+05 \ +1.3557410e+05 \ +1.3754530e+05 \ +1.3174870e+05 \ +1.3618700e+05 \ +# 1.2822240e+05 \ +1.3489700e+05 \ +1.3489700e+05 \ +1.3877250e+05 \ +# 1.2871930e+05 \ +1.3510420e+05 \ +1.3608410e+05 \ +1.3233160e+05 \ +1.3442000e+05 \ +# 1.2889280e+05 \ +1.3846590e+05 \ +1.3240020e+05 \ +1.3541560e+05 \ +1.3590830e+05 \ +1.3847970e+05 \ +1.3797980e+05 \ +1.3765680e+05 \ +1.3714520e+05 \ +1.3574460e+05 \ +1.3557410e+05 \ +1.3552260e+05 \ +1.3366660e+05 \ +1.4038570e+05 \ +1.3444230e+05 \ +1.3625040e+05 \ +1.3270990e+05 \ +1.3483780e+05 \ +1.3592010e+05 \ +1.3485810e+05 \ +1.3541410e+05 \ +1.3364430e+05 \ +1.3469720e+05 \ +1.3771440e+05 \ +1.3480640e+05 \ +1.3494630e+05 \ +1.3357600e+05 \ +1.3514900e+05 \ +1.3645260e+05 \ +1.3280770e+05 \ +1.3781680e+05 \ +1.3538830e+05 \ +1.3568110e+05 \ +1.3470240e+05 \ +1.3574460e+05 \ +1.3315060e+05 \ +1.3517210e+05 \ +1.3521200e+05 \ +1.3179080e+05 \ +1.3790530e+05 \ +1.3778120e+05 \ +1.3601670e+05 \ +1.3933510e+05 \ +1.3590830e+05 \ +1.3181900e+05 \ +1.3583050e+05 \ +1.3836800e+05 \ +1.3827410e+05 \ +1.3500860e+05 \ +1.3379740e+05 \ +1.3329600e+05 \ +1.3235610e+05 \ +1.3933510e+05 \ +1.3721290e+05 \ +1.3627140e+05 \ +1.3235950e+05 \ +1.3235950e+05 \ +1.3707830e+05 \ +1.3536040e+05 \ +1.3737480e+05 \ +1.3745570e+05 \ +1.3429350e+05 \ +1.3713320e+05 \ +1.3380510e+05 \ +1.3438120e+05 \ +1.3566370e+05 \ +1.3780070e+05 \ +1.3815580e+05 \ +1.3123800e+05 \ +1.3424320e+05 \ +# 1.3903670e+05 \ +1.3390860e+05 \ +1.3617620e+05 \ +# 1.3885780e+05 \ +1.3364260e+05 \ +1.3629530e+05 \ +1.3800950e+05 \ +1.3320010e+05 \ +1.3337110e+05 \ +1.3667100e+05 \ +1.3565500e+05 \ +1.3607330e+05 \ +1.3529730e+05 \ +# 1.3771700e+05 \ +1.3064140e+05 \ +1.2545610e+05 \ +1.2065880e+05 \ +1.2065880e+05 \ +# 1.1051840e+05 \ +# 1.1060850e+05 \ +# 1.1283270e+05 \ +# 1.0823010e+05 \ +1.1238810e+05 \ +# 1.1006930e+05 \ +# 1.0918910e+05 \ +# 1.1061920e+05 \ +1.1422910e+05 \ +1.1360430e+05 \ +1.1796200e+05 \ +# 1.1032310e+05 \ +1.1230670e+05 \ +1.1370680e+05 \ +1.1692870e+05 \ +1.1311060e+05 \ +1.1168490e+05 \ +1.1469000e+05 \ +1.1497410e+05 \ +1.1663660e+05 \ +1.1200550e+05 \ +# 1.1057960e+05 \ +1.1422380e+05 \ +1.1628610e+05 \ +1.1353970e+05 \ +# 1.0972470e+05 \ +1.1280920e+05 \ +1.1612800e+05 \ +1.1386310e+05 \ +1.1480910e+05 \ +1.1126220e+05 \ +1.1529870e+05 \ +# 1.2197110e+05 \ +1.1370820e+05 \ +1.1624550e+05 \ +1.1835330e+05 \ +1.1703980e+05 \ +1.1678470e+05 \ +1.1745180e+05 \ +1.1157370e+05 \ +# 1.0827400e+05 \ +1.1157330e+05 \ +1.1246700e+05 \ +1.1469370e+05 \ +1.1661500e+05 \ +1.1563750e+05 \ +1.1474230e+05 \ +1.1575550e+05 \ +1.1893930e+05 \ +1.1619760e+05 \ +# 1.1989830e+05 \ +1.1555510e+05 \ +1.1467210e+05 \ +1.1678540e+05 \ +1.1432660e+05 \ +1.1565290e+05 \ +1.1665480e+05 \ +1.1212620e+05 \ +1.1652550e+05 \ +1.1869030e+05 \ +1.1601990e+05 \ +1.1269970e+05 \ +1.1544150e+05 \ +1.1515240e+05 \ +1.1319210e+05 \ +1.1421450e+05 \ +1.1428640e+05 \ +1.1023730e+05 \ +1.1526140e+05 \ +1.1980360e+05 \ +1.1265840e+05 \ +1.1858170e+05 \ +1.1308910e+05 \ +1.1308910e+05 \ +1.1636870e+05 \ +1.1501770e+05 \ +1.1289170e+05 \ +1.1289170e+05 \ +1.1887760e+05 \ +# 1.0939530e+05 \ +1.1562740e+05 \ +1.1573760e+05 \ +1.1509160e+05 \ +1.1392060e+05 \ +1.1452120e+05 \ +1.1097150e+05 \ +1.1452740e+05 \ +1.1317210e+05 \ +1.1530310e+05 \ +1.1824340e+05 \ +1.1533910e+05 \ +1.1401650e+05 \ +1.1677200e+05 \ +1.1594410e+05 \ +1.1545650e+05 \ +1.1442010e+05 \ +1.1289050e+05 \ +1.1465040e+05 \ +1.1306240e+05 \ +1.1315960e+05 \ +1.1396820e+05 \ +1.1307440e+05 \ +1.1448410e+05 \ +1.1398830e+05 \ +1.1619210e+05 \ +1.1206530e+05 \ +1.1500960e+05 \ +1.1701250e+05 \ +1.1475680e+05 \ +1.1099260e+05 \ +1.1491950e+05 \ +1.1704650e+05 \ +1.1684830e+05 \ +1.1272810e+05 \ +1.1131230e+05 \ +# 1.2049040e+05 \ +1.1578330e+05 \ +1.1490770e+05 \ +1.1694320e+05 \ +1.1701250e+05 \ +1.1755020e+05 \ +# 1.0620790e+05 \ +1.1419770e+05 \ +1.1544860e+05 \ +1.1463250e+05 \ +1.1712940e+05 \ +1.1433830e+05 \ +1.1665700e+05 \ +1.1147380e+05 \ +1.1410000e+05 \ +1.1524560e+05 \ +1.1539970e+05 \ +1.1392210e+05 \ +1.1290380e+05 \ +1.1436510e+05 \ +1.1600490e+05 \ +1.1198550e+05 \ +1.1907310e+05 \ +1.1418440e+05 \ +1.1645090e+05 \ +1.1793380e+05 \ +1.1878150e+05 \ +1.1246700e+05 \ +1.1361550e+05 \ +1.1507020e+05 \ +1.1610530e+05 \ +1.1651230e+05 \ +1.1355970e+05 \ +1.1604680e+05 \ +1.1811920e+05 \ +1.1548670e+05 \ +1.1568570e+05 \ +1.1518850e+05 \ +1.1581100e+05 \ +1.1356290e+05 \ +1.1529080e+05 \ +1.1529080e+05 \ +1.1700570e+05 \ +1.1752220e+05 \ +1.1393810e+05 \ +1.1738540e+05 \ +1.1695300e+05 \ +1.1794790e+05 \ +1.1524910e+05 \ +1.1563990e+05 \ +1.2041380e+05 \ +1.1631370e+05 \ +1.1360430e+05 \ +1.1404530e+05 \ +1.1345360e+05 \ +1.1530670e+05 \ +1.1684130e+05 \ +# 1.1159320e+05 \ +1.1487530e+05 \ +1.1539970e+05 \ +1.1639490e+05 \ +1.1575550e+05 \ +1.1527760e+05 \ +1.1726300e+05 \ +1.2270910e+05 \ +1.2325150e+05 \ +# 1.2960910e+05 \ +1.2472960e+05 \ +1.2754220e+05 \ +1.2616790e+05 \ +1.2902200e+05 \ +1.2878280e+05 \ +1.3026980e+05 \ +# 1.3300720e+05 \ +1.2770870e+05 \ +1.2687130e+05 \ +1.3136780e+05 \ +1.2943370e+05 \ +1.2633200e+05 \ +1.2902200e+05 \ +1.3223370e+05 \ +1.2752030e+05 \ +1.3190390e+05 \ +1.2800780e+05 \ +1.2952120e+05 \ +1.3151290e+05 \ +1.3096680e+05 \ +1.2983430e+05 \ +1.2669670e+05 \ +1.3116250e+05 \ +1.3248660e+05 \ +1.3188310e+05 \ +1.2827300e+05 \ +1.2934760e+05 \ +1.2575330e+05 \ +1.3079100e+05 \ +1.2580110e+05 \ +1.2759940e+05 \ +1.3013940e+05 \ +1.3011910e+05 \ +1.2689590e+05 \ +1.3192170e+05 \ +1.2612520e+05 \ +1.2612520e+05 \ +# 1.2233680e+05 \ +1.2873960e+05 \ +1.2826550e+05 \ +1.3046840e+05 \ +1.2994410e+05 \ +1.2829060e+05 \ +1.2676540e+05 \ +1.2764410e+05 \ +1.2665780e+05 \ +1.2840390e+05 \ +1.2945540e+05 \ +1.3138750e+05 \ +1.2876120e+05 \ +1.3300410e+05 \ +1.3000910e+05 \ +1.2846860e+05 \ +1.2786050e+05 \ +1.2842580e+05 \ +1.3042180e+05 \ +1.2696020e+05 \ +1.2919120e+05 \ +1.3067160e+05 \ +1.3196920e+05 \ +1.2665700e+05 \ +1.2682960e+05 \ +1.2820740e+05 \ +1.3065910e+05 \ +1.2981260e+05 \ +1.3107710e+05 \ +1.2858680e+05 \ +1.3311710e+05 \ +1.2904360e+05 \ +1.2998620e+05 \ +1.2494160e+05 \ +1.3335540e+05 \ +1.2954190e+05 \ +1.2982650e+05 \ +1.3308280e+05 \ +1.2954400e+05 \ +1.2783900e+05 \ +1.2783900e+05 \ +1.2876770e+05 \ +1.2676470e+05 \ +1.2714880e+05 \ +1.2807080e+05 \ +1.2902270e+05 \ +1.2615240e+05 \ +1.2693990e+05 \ +1.2586270e+05 \ +1.3440860e+05 \ +1.3181940e+05 \ +1.3074750e+05 \ +1.2822940e+05 \ +# 1.2350510e+05 \ +1.3156140e+05 \ +1.3109910e+05 \ +1.3131470e+05 \ +1.3208830e+05 \ +1.2868540e+05 \ +1.2812130e+05 \ +1.3021190e+05 \ +1.3024520e+05 \ +1.2943520e+05 \ +1.3081280e+05 \ +1.2809280e+05 \ +1.3002950e+05 \ +1.2661350e+05 \ +1.3406070e+05 \ +1.2992120e+05 \ +1.2814300e+05 \ +1.3197080e+05 \ +1.3173100e+05 \ +1.3423000e+05 \ +1.3063730e+05 \ +1.3202260e+05 \ +1.2577130e+05 \ +1.3033340e+05 \ +1.2504340e+05 \ +1.3180230e+05 \ +1.3281890e+05 \ +1.2895710e+05 \ +# 1.2440060e+05 \ +1.3283780e+05 \ +1.3031620e+05 \ +# 1.3563530e+05 \ +1.2745250e+05 \ +1.2748490e+05 \ +1.3099450e+05 \ +1.3057710e+05 \ +1.2969060e+05 \ +1.3162610e+05 \ +1.3092130e+05 \ +1.3296490e+05 \ +1.3055200e+05 \ +1.2908680e+05 \ +# 1.2472580e+05 \ +1.2897870e+05 \ +1.3172060e+05 \ +1.2698420e+05 \ +1.2958620e+05 \ +1.3246460e+05 \ +1.3230240e+05 \ +1.3022490e+05 \ +1.2730390e+05 \ +1.2864540e+05 \ +1.3127910e+05 \ +1.3142550e+05 \ +1.2543200e+05 \ +1.2861530e+05 \ +1.2872410e+05 \ +1.3031170e+05 \ +1.2633670e+05 \ +1.2963100e+05 \ +1.3040330e+05 \ +1.3068430e+05 \ +1.3062240e+05 \ +1.3062240e+05 \ +1.2705900e+05 \ +1.2705900e+05 \ +1.3265650e+05 \ +1.3265650e+05 \ +1.2971660e+05 \ +# 1.2200510e+05 \ +1.2732570e+05 \ +1.3253040e+05 \ +1.3307000e+05 \ +1.2919560e+05 \ +1.2875380e+05 \ +1.2679350e+05 \ +1.2918740e+05 \ +1.2927770e+05 \ +1.3153730e+05 \ +# 1.3228600e+05 \ +1.2702590e+05 \ +1.2979090e+05 \ +1.2820760e+05 \ +# 1.3252340e+05 \ +1.2871750e+05 \ +# 1.3050700e+05 \ +1.2682900e+05 \ +1.2468190e+05 \ +1.2413890e+05 \ +1.2017070e+05 \ +1.1846720e+05 \ +1.2021370e+05 \ +1.2212380e+05 \ +1.2524630e+05 \ +1.1909310e+05 \ +1.2170180e+05 \ +1.2170820e+05 \ +# 1.1496690e+05 \ +1.1678180e+05 \ +# 1.1585620e+05 \ +1.2125970e+05 \ +1.1882120e+05 \ +1.2130550e+05 \ +# 1.1575050e+05 \ +1.1800560e+05 \ +# 1.1605400e+05 \ +1.1987790e+05 \ +1.1820760e+05 \ +# 1.1553010e+05 \ +1.1999900e+05 \ +1.1936580e+05 \ +1.2187950e+05 \ +1.2113060e+05 \ +1.1983630e+05 \ +1.1856550e+05 \ +1.2045320e+05 \ +1.1618210e+05 \ +1.1925520e+05 \ +1.2079350e+05 \ +1.2300780e+05 \ +1.1812210e+05 \ +1.1939210e+05 \ +1.1944850e+05 \ +1.2086670e+05 \ +1.1943300e+05 \ +1.2063790e+05 \ +1.2010480e+05 \ +1.1731550e+05 \ +1.1717530e+05 \ +1.2109370e+05 \ +1.1976270e+05 \ +1.2175940e+05 \ +1.1964310e+05 \ +1.2186340e+05 \ +# 1.2471410e+05 \ +1.1955870e+05 \ +1.2005460e+05 \ +1.2013380e+05 \ +1.1850300e+05 \ +1.2291410e+05 \ +1.2461430e+05 \ +1.1952270e+05 \ +1.1952270e+05 \ +1.2286630e+05 \ +1.2219170e+05 \ +1.1703030e+05 \ +1.1703030e+05 \ +1.1823990e+05 \ +1.2008750e+05 \ +1.2008750e+05 \ +1.2059170e+05 \ +1.1833630e+05 \ +1.2109700e+05 \ +1.1865520e+05 \ +# 1.1376180e+05 \ +1.1904290e+05 \ +1.2044480e+05 \ +1.1960020e+05 \ +# 1.2509190e+05 \ +1.2228660e+05 \ +1.2274910e+05 \ +1.2088330e+05 \ +1.1853270e+05 \ +1.1961590e+05 \ +1.1815730e+05 \ +1.1952780e+05 \ +1.2314930e+05 \ +1.1919330e+05 \ +1.2130550e+05 \ +1.1755050e+05 \ +1.1685050e+05 \ +# 1.1352230e+05 \ +# 1.2566790e+05 \ +1.2086170e+05 \ +1.1918270e+05 \ +1.2074740e+05 \ +1.1911180e+05 \ +1.2235700e+05 \ +1.1963440e+05 \ +1.2191260e+05 \ +1.2073880e+05 \ +1.1930200e+05 \ +1.1667790e+05 \ +1.2015090e+05 \ +1.1886400e+05 \ +1.2041160e+05 \ +1.2118280e+05 \ +1.2149980e+05 \ +1.2364930e+05 \ +1.2146270e+05 \ +1.1903090e+05 \ +1.1783940e+05 \ +1.1962670e+05 \ +# 1.1394640e+05 \ +1.1994160e+05 \ +1.2077320e+05 \ +1.1770030e+05 \ +1.1821340e+05 \ +1.2184980e+05 \ +1.2184980e+05 \ +1.2456190e+05 \ +1.1829420e+05 \ +1.2218480e+05 \ +1.2285100e+05 \ +# 1.1503710e+05 \ +1.2126370e+05 \ +1.2265420e+05 \ +1.1948630e+05 \ +1.1957440e+05 \ +1.2318620e+05 \ +1.1894130e+05 \ +1.2037460e+05 \ +1.2233350e+05 \ +1.2120510e+05 \ +1.1805890e+05 \ +1.2242420e+05 \ +1.2231920e+05 \ +# 1.2589900e+05 \ +1.2267840e+05 \ +1.2136920e+05 \ +1.2202600e+05 \ +1.2203500e+05 \ +1.2096680e+05 \ +1.1740520e+05 \ +1.1598150e+05 \ +1.1870270e+05 \ +1.1572450e+05 \ +1.2060050e+05 \ +1.2362670e+05 \ +1.1935010e+05 \ +1.1806150e+05 \ +1.2153860e+05 \ +1.2018680e+05 \ +1.1889990e+05 \ +1.2032200e+05 \ +1.1844590e+05 \ +1.2044870e+05 \ +1.2229670e+05 \ +1.1672710e+05 \ +1.2124560e+05 \ +1.1993680e+05 \ +1.2409900e+05 \ +1.1953340e+05 \ +1.1872740e+05 \ +1.1947070e+05 \ +1.1924490e+05 \ +1.1869710e+05 \ +1.2010350e+05 \ +1.2284830e+05 \ +1.2182880e+05 \ +1.1820450e+05 \ +1.1820450e+05 \ +1.1957900e+05 \ +1.1922940e+05 \ +1.1922940e+05 \ +1.2100760e+05 \ +1.1649890e+05 \ +1.2211690e+05 \ +1.2085810e+05 \ +1.1746040e+05 \ +1.1817640e+05 \ +1.2290090e+05 \ +1.1720740e+05 \ +1.2025060e+05 \ +1.2017640e+05 \ +1.2081500e+05 \ +1.2034280e+05 \ +1.1769320e+05 \ +1.1583970e+05 \ +# 1.1434160e+05 \ +1.1741040e+05 \ +1.1853930e+05 \ +1.1991900e+05 \ +1.1969930e+05 \ +1.1587710e+05 \ +1.1987120e+05 \ +1.2007020e+05 \ +1.2140280e+05 \ +1.1516610e+05 \ +1.1962200e+05 \ +1.1925100e+05 \ +1.1932080e+05 \ +1.1867580e+05 \ +1.2050460e+05 \ +1.2329350e+05 \ +1.1964770e+05 \ +1.1858040e+05 \ +1.2133490e+05 \ +1.1960640e+05 \ +1.1584930e+05 \ +1.1986680e+05 \ +1.1740580e+05 \ +1.2017420e+05 \ +1.1649060e+05 \ +1.1705490e+05 \ +# 1.1315200e+05 \ +1.1862150e+05 \ +1.2051780e+05 \ +1.2216900e+05 \ +1.1790970e+05 \ +1.1902120e+05 \ +1.1997320e+05 \ +1.1792910e+05 \ +1.1686870e+05 \ +1.2077260e+05 \ +1.1704650e+05 \ +1.1642040e+05 \ +1.2248130e+05 \ +1.1743140e+05 \ +1.1885140e+05 \ +1.1849240e+05 \ +1.1790240e+05 \ +1.1923580e+05 \ +1.2240720e+05 \ +1.1942410e+05 \ +1.2048630e+05 \ +1.1675860e+05 \ +1.1849240e+05 \ +1.2016800e+05 \ +1.1873140e+05 \ +1.2237560e+05 \ +1.1961180e+05 \ +1.1863460e+05 \ +1.2041290e+05 \ +1.2092020e+05 \ +1.2016800e+05 \ +1.2083620e+05 \ +1.2083620e+05 \ +1.1927850e+05 \ +1.1887200e+05 \ +1.1887200e+05 \ +1.1591160e+05 \ +1.2074020e+05 \ +1.1987120e+05 \ +1.1987120e+05 \ +1.2285270e+05 \ +1.2039690e+05 \ +1.1771930e+05 \ +1.2254740e+05 \ +1.2015430e+05 \ +1.1594480e+05 \ +1.1915340e+05 \ +1.1940880e+05 \ +1.1805970e+05 \ +1.1897310e+05 \ +1.1591910e+05 \ +1.2316320e+05 \ +1.2010590e+05 \ +1.1430130e+05 \ +1.1647360e+05 \ +1.2225610e+05 \ +1.1698530e+05 \ +1.2243810e+05 \ +1.1812730e+05 \ +1.2212850e+05 \ +1.1717030e+05 \ +1.1814780e+05 \ +1.1819020e+05 \ +1.1882140e+05 \ +1.1972140e+05 \ +1.2206340e+05 \ +1.1631220e+05 \ +1.2019000e+05 \ +1.1802420e+05 \ +1.1565780e+05 \ +1.2018630e+05 \ +1.1897610e+05 \ +1.1903480e+05 \ +1.1720600e+05 \ +1.1617150e+05 \ +1.1891860e+05 \ +1.1845590e+05 \ +1.2000110e+05 \ +1.2214310e+05 \ +1.1975200e+05 \ +# 1.1346470e+05 \ +1.1620620e+05 \ +1.1830490e+05 \ +1.1808630e+05 \ +1.2040340e+05 \ +1.1557270e+05 \ +1.1942410e+05 \ +1.2000610e+05 \ +1.1913920e+05 \ +1.1626730e+05 \ +1.1678470e+05 \ +1.1866980e+05 \ +1.1614830e+05 \ +1.1907920e+05 \ +1.2200930e+05 \ +1.1555510e+05 \ +1.1874630e+05 \ +1.1761290e+05 \ +1.1633250e+05 \ +1.1569840e+05 \ +1.1811300e+05 \ +1.2042880e+05 \ +# 1.2397450e+05 \ +1.1947070e+05 \ +1.1912180e+05 \ +1.1823130e+05 \ +1.1605520e+05 \ +1.1826570e+05 \ +1.2000610e+05 \ +1.2284260e+05 \ +1.2068500e+05 \ +1.1977290e+05 \ +1.1803400e+05 \ +1.1440320e+05 \ +1.1864930e+05 \ +1.1518050e+05 \ +1.1870510e+05 \ +1.2175740e+05 \ +1.1683440e+05 \ +1.1837050e+05 \ +1.1765380e+05 \ +1.1752970e+05 \ +1.1687510e+05 \ +1.1622520e+05 \ +1.2023250e+05 \ +1.2023250e+05 \ +1.1507660e+05 \ +1.1694320e+05 \ +1.2099540e+05 \ +1.2099540e+05 \ +1.1736870e+05 \ +1.1872570e+05 \ +1.1832650e+05 \ +1.1895560e+05 \ +1.1637960e+05 \ +1.1874120e+05 \ +1.1763330e+05 \ +1.1717690e+05 \ +1.2124180e+05 \ +1.1673760e+05 \ +1.2220710e+05 \ +1.1715660e+05 \ +1.1767830e+05 \ +1.1819020e+05 \ +1.1594300e+05 \ +1.1691070e+05 \ +1.1592660e+05 \ +1.2243840e+05 \ +1.1727380e+05 \ +1.1768610e+05 \ +1.1790240e+05 \ +1.1792710e+05 \ +# 1.1435350e+05 \ +1.2057840e+05 \ +1.2571320e+05 \ +1.3337100e+05 \ +1.3007430e+05 \ +# 1.3735960e+05 \ +1.3362100e+05 \ +1.3786660e+05 \ +1.3532500e+05 \ +1.3462670e+05 \ +1.3338250e+05 \ +1.3795710e+05 \ +1.3795710e+05 \ +1.3521270e+05 \ +1.3619470e+05 \ +1.3397130e+05 \ +1.3641330e+05 \ +1.3722930e+05 \ +1.3050840e+05 \ +1.3721850e+05 \ +1.3576570e+05 \ +1.3612360e+05 \ +1.3599550e+05 \ +1.3556850e+05 \ +1.3648950e+05 \ +1.3294630e+05 \ +# 1.4010900e+05 \ +1.3634020e+05 \ +1.3594790e+05 \ +1.3300160e+05 \ +1.3781680e+05 \ +1.3568250e+05 \ +1.3340100e+05 \ +1.3578420e+05 \ +1.3269520e+05 \ +1.3807850e+05 \ +1.3674950e+05 \ +1.3330670e+05 \ +1.3583980e+05 \ +1.3201220e+05 \ +1.3486940e+05 \ +1.3821540e+05 \ +1.3590300e+05 \ +1.3471510e+05 \ +1.3474190e+05 \ +1.3653280e+05 \ +1.3731090e+05 \ +1.3775460e+05 \ +1.3708000e+05 \ +1.3469500e+05 \ +1.3592550e+05 \ +1.3552260e+05 \ +1.3248210e+05 \ +1.3530710e+05 \ +1.3457610e+05 \ +1.3303630e+05 \ +1.3414820e+05 \ +1.3561380e+05 \ +1.3491940e+05 \ +# 1.3878270e+05 \ +# 1.3840480e+05 \ +# 1.3728630e+05 \ +1.3036000e+05 \ +1.2644740e+05 \ +# 1.1928140e+05 \ +1.2001040e+05 \ +1.2340690e+05 \ +# 1.1719700e+05 \ +1.2237740e+05 \ +1.2299440e+05 \ +1.1927610e+05 \ +1.2231920e+05 \ +1.1862190e+05 \ +1.1841370e+05 \ +1.1742340e+05 \ +1.2431660e+05 \ +1.1873290e+05 \ +1.2126650e+05 \ +1.1835030e+05 \ +1.1709180e+05 \ +1.1962440e+05 \ +1.1962440e+05 \ +1.1671210e+05 \ +1.1985130e+05 \ +1.1985130e+05 \ +1.1627230e+05 \ +1.1963300e+05 \ +1.1800500e+05 \ +1.1800500e+05 \ +1.1999920e+05 \ +1.1692690e+05 \ +1.2321970e+05 \ +1.1909310e+05 \ +1.2008860e+05 \ +1.1601730e+05 \ +1.1881570e+05 \ +1.2217420e+05 \ +1.1815140e+05 \ +1.1996240e+05 \ +1.1644440e+05 \ +1.2416880e+05 \ +# 1.1491530e+05 \ +1.1890500e+05 \ +1.1950350e+05 \ +1.2210420e+05 \ +1.2164860e+05 \ +1.2231850e+05 \ +1.1812570e+05 \ +1.1830900e+05 \ +1.2049170e+05 \ +1.1869520e+05 \ +1.2187070e+05 \ +1.2076460e+05 \ +1.1930710e+05 \ +1.1783940e+05 \ +1.2090410e+05 \ +1.1900870e+05 \ +# 1.1597820e+05 \ +1.1904630e+05 \ +1.2139260e+05 \ +1.1849700e+05 \ +1.1891090e+05 \ +1.1855670e+05 \ +# 1.1506520e+05 \ +1.2168590e+05 \ +1.2581380e+05 \ +1.3034220e+05 \ +1.2648300e+05 \ +1.2783900e+05 \ +1.3018010e+05 \ +1.3096300e+05 \ +1.2715640e+05 \ +1.3026830e+05 \ +1.3044510e+05 \ +1.2949860e+05 \ +1.3048700e+05 \ +1.2954290e+05 \ +1.2798650e+05 \ +1.2926230e+05 \ +1.3242080e+05 \ +1.2945540e+05 \ +# 1.3311290e+05 \ +1.2918910e+05 \ +1.3158780e+05 \ +1.2877620e+05 \ +1.2786050e+05 \ +1.2885610e+05 \ +1.2678290e+05 \ +1.2631730e+05 \ +1.2579400e+05 \ +1.2652790e+05 \ +1.2779450e+05 \ +1.2779600e+05 \ +1.2818630e+05 \ +1.3079280e+05 \ +1.2709070e+05 \ +1.2734030e+05 \ +1.2866540e+05 \ +1.3168930e+05 \ +1.2873960e+05 \ +1.2975590e+05 \ +1.3109510e+05 \ +1.2960900e+05 \ +1.2781750e+05 \ +1.2753540e+05 \ +1.3130090e+05 \ +1.2416470e+05 \ +1.3007430e+05 \ +1.3275300e+05 \ +1.3005980e+05 \ +1.2829450e+05 \ +1.2908610e+05 \ +# 1.3375430e+05 \ +1.2670200e+05 \ +1.2936750e+05 \ +1.3017880e+05 \ +1.2873960e+05 \ +1.3090600e+05 \ +1.3053030e+05 \ +1.3117950e+05 \ +1.2975590e+05 \ +1.3020320e+05 \ +1.2796490e+05 \ +1.2779620e+05 \ +1.2736210e+05 \ +1.1959590e+05 \ +# 1.1396910e+05 \ +# 1.1396910e+05 \ +1.1790970e+05 \ +1.1715980e+05 \ +1.1734460e+05 \ +1.1341210e+05 \ +1.1341210e+05 \ +1.1807200e+05 \ +1.1807200e+05 \ +1.1695140e+05 \ +1.1341210e+05 \ +1.1802350e+05 \ +1.1489550e+05 \ +1.1907530e+05 \ +1.1664990e+05 \ +1.1922250e+05 \ +1.1773580e+05 \ +1.1986170e+05 \ +1.1568570e+05 \ +1.1614830e+05 \ +1.1723060e+05 \ +1.1283980e+05 \ +1.1364450e+05 \ +1.1831100e+05 \ +1.1849970e+05 \ +1.1774340e+05 \ +1.1562490e+05 \ +1.1283980e+05 \ +1.1431820e+05 \ +1.1252680e+05 \ +1.1388580e+05 \ +1.1384060e+05 \ +1.1525700e+05 \ +1.1576820e+05 \ +1.1514410e+05 \ +1.1115070e+05 \ +1.1745460e+05 \ +1.1737020e+05 \ +1.1662430e+05 \ +1.1650450e+05 \ +1.1610970e+05 \ +1.1588600e+05 \ +1.1199540e+05 \ +1.1603400e+05 \ +1.1241150e+05 \ +1.1412750e+05 \ +1.1588600e+05 \ +1.1347970e+05 \ +1.1420590e+05 \ +1.1495170e+05 \ +1.1090080e+05 \ +1.1576820e+05 \ +1.1991850e+05 \ +1.1464830e+05 \ +1.1464640e+05 \ +1.1680060e+05 \ +1.1678730e+05 \ +1.1631280e+05 \ +1.1710390e+05 \ +1.1657440e+05 \ +1.1368470e+05 \ +1.1961160e+05 \ +1.1622180e+05 \ +1.1647750e+05 \ +1.1468810e+05 \ +1.1368120e+05 \ +1.1781110e+05 \ +1.1362110e+05 \ +1.1521670e+05 \ +1.1873260e+05 \ +# 1.1071300e+05 \ +1.1204520e+05 \ +1.1554260e+05 \ +1.1647630e+05 \ +1.1202550e+05 \ +1.1474230e+05 \ +1.1686870e+05 \ +1.1333190e+05 \ +1.1164440e+05 \ +1.1443710e+05 \ +1.1718020e+05 \ +1.1449630e+05 \ +1.1538740e+05 \ +1.1398560e+05 \ +1.1651420e+05 \ +1.1651420e+05 \ +1.1728040e+05 \ +1.1852620e+05 \ +1.1426630e+05 \ +1.1503790e+05 \ +1.1503790e+05 \ +1.1666410e+05 \ +1.1736870e+05 \ +1.1396490e+05 \ +1.1396490e+05 \ +1.1374370e+05 \ +1.1812540e+05 \ +1.1812540e+05 \ +1.1911780e+05 \ +1.1642240e+05 \ +1.1824950e+05 \ +1.1403450e+05 \ +1.1236660e+05 \ +1.1382540e+05 \ +1.1487530e+05 \ +1.1705490e+05 \ +1.1757980e+05 \ +1.1647670e+05 \ +1.1684130e+05 \ +1.1584930e+05 \ +1.1602050e+05 \ +1.1852470e+05 \ +1.1902300e+05 \ +1.1701250e+05 \ +1.1671090e+05 \ +1.1644280e+05 \ +1.1799680e+05 \ +1.1763330e+05 \ +1.1275860e+05 \ +1.1439690e+05 \ +1.1495170e+05 \ +1.1813450e+05 \ +1.1537170e+05 \ +1.1947600e+05 \ +1.1387770e+05 \ +# 1.2211900e+05 \ +1.2153840e+05 \ +1.1447740e+05 \ +1.1535850e+05 \ +1.1810680e+05 \ +1.1990290e+05 \ +1.1870510e+05 \ +1.1503400e+05 \ +1.2086150e+05 \ +1.1851880e+05 \ +1.1740300e+05 \ +1.1816010e+05 \ +1.1891880e+05 \ +1.1713100e+05 \ +1.1542130e+05 \ +1.1492430e+05 \ +1.1862740e+05 \ +1.1875310e+05 \ +1.1336300e+05 \ +# 1.2269160e+05 \ +# 1.1040910e+05 \ +1.1767430e+05 \ +1.1807200e+05 \ +1.1591380e+05 \ +1.1668990e+05 \ +1.1677200e+05 \ +1.1842940e+05 \ +1.1799510e+05 \ +# 1.1099130e+05 \ +1.1932500e+05 \ +1.1664080e+05 \ +1.1569340e+05 \ +1.1785460e+05 \ +1.1316120e+05 \ +1.1610320e+05 \ +1.1616630e+05 \ +# 1.2295830e+05 \ +1.1732420e+05 \ +1.1615560e+05 \ +1.1753620e+05 \ +1.1680500e+05 \ +1.1800550e+05 \ +1.1666320e+05 \ +1.1827000e+05 \ +1.1769470e+05 \ +1.1441700e+05 \ +1.1175420e+05 \ +1.1366460e+05 \ +1.1690940e+05 \ +1.1412140e+05 \ +1.1442540e+05 \ +1.1265740e+05 \ +1.1284820e+05 \ +1.1091210e+05 \ +# 1.0273490e+05 \ +# 8.6441490e+04 \ +# 8.6441490e+04 \ +# 6.9721540e+04 \ +# 6.4234380e+04 \ +# 6.4234380e+04 \ +# 8.1135480e+04 \ +# 8.1135480e+04 \ +# 1.0415760e+05 \ +# 1.0415760e+05 \ +1.0797020e+05 \ +# 1.0210710e+05 \ +1.0981200e+05 \ +1.0782720e+05 \ +1.0978700e+05 \ +1.0818520e+05 \ +1.1097080e+05 \ +1.0859530e+05 \ +1.1152380e+05 \ +1.1069850e+05 \ +1.1162450e+05 \ +1.1383430e+05 \ +1.1072110e+05 \ +# 1.0160150e+05 \ +1.1202530e+05 \ +1.0634370e+05 \ +1.1063900e+05 \ +1.0784530e+05 \ +1.1542130e+05 \ +1.0880460e+05 \ +1.1003850e+05 \ +# 1.0525750e+05 \ +1.1182500e+05 \ +1.0846200e+05 \ +1.0928740e+05 \ +1.1202570e+05 \ +1.1119230e+05 \ +1.0962190e+05 \ +1.0667740e+05 \ +1.1197570e+05 \ +1.1170470e+05 \ +1.1428110e+05 \ +1.0797830e+05 \ +1.1177950e+05 \ +1.1083070e+05 \ +1.1091130e+05 \ +1.1004720e+05 \ +1.1189460e+05 \ +1.1015610e+05 \ +# 1.1597990e+05 \ +1.1164850e+05 \ +1.1269610e+05 \ +1.0609670e+05 \ +1.1068020e+05 \ +1.1073950e+05 \ +1.1328330e+05 \ +1.0849360e+05 \ +1.1089960e+05 \ +1.1192580e+05 \ +1.0964570e+05 \ +1.1040910e+05 \ +1.1040910e+05 \ +1.1140700e+05 \ +1.1127180e+05 \ +1.1012980e+05 \ +1.1516460e+05 \ +1.1240810e+05 \ +1.1318450e+05 \ +# 1.0647570e+05 \ +1.1058870e+05 \ +1.1441190e+05 \ +1.1364340e+05 \ +1.1176970e+05 \ +1.1496610e+05 \ +1.0908600e+05 \ +1.1424080e+05 \ +1.0944610e+05 \ +1.1406830e+05 \ +1.1187480e+05 \ +1.1187480e+05 \ +1.1255850e+05 \ +1.1249730e+05 \ +1.0818520e+05 \ +1.1446560e+05 \ +1.1185480e+05 \ +1.1076070e+05 \ +1.0874580e+05 \ +1.1411550e+05 \ +1.1384560e+05 \ +1.1155560e+05 \ +1.0896610e+05 \ +1.1169420e+05 \ +1.1584410e+05 \ +1.1122680e+05 \ +1.1253850e+05 \ +1.1253850e+05 \ +1.1252760e+05 \ +1.1251850e+05 \ +1.1536380e+05 \ +1.0846200e+05 \ +1.1466020e+05 \ +1.1279980e+05 \ +1.0991490e+05 \ +1.1233720e+05 \ +1.1403660e+05 \ +1.1316120e+05 \ +1.1131160e+05 \ +1.1098400e+05 \ +1.1116170e+05 \ +1.1068780e+05 \ +1.1416790e+05 \ +1.1362280e+05 \ +1.1362280e+05 \ +1.1096120e+05 \ +1.0959800e+05 \ +1.0968970e+05 \ +1.0759050e+05 \ +1.0983590e+05 \ +1.0776770e+05 \ +1.1003480e+05 \ +1.0902210e+05 \ +1.1511490e+05 \ +1.1176380e+05 \ +1.0979640e+05 \ +1.0820000e+05 \ +1.0820000e+05 \ +1.1283980e+05 \ +1.0964160e+05 \ +1.1560960e+05 \ +1.1547120e+05 \ +1.1179950e+05 \ +1.0958530e+05 \ +1.1271030e+05 \ +1.1032670e+05 \ +1.0958970e+05 \ +1.0673340e+05 \ +1.0953730e+05 \ +1.1270370e+05 \ +1.0679630e+05 \ +1.0679630e+05 \ +1.1001180e+05 \ +1.1188930e+05 \ +1.1261850e+05 \ +1.1154320e+05 \ +1.1174410e+05 \ +1.0986420e+05 \ +1.1096030e+05 \ +1.0987540e+05 \ +1.1265740e+05 \ +1.1380670e+05 \ +1.1348260e+05 \ +1.1097460e+05 \ +1.1091210e+05 \ +# 1.1629720e+05 \ +# 1.1629720e+05 \ +1.1309330e+05 \ +1.0816820e+05 \ +1.1049060e+05 \ +1.0911370e+05 \ +1.1565780e+05 \ +# 1.1613650e+05 \ +1.1391190e+05 \ +1.1190450e+05 \ +1.1540900e+05 \ +1.0833100e+05 \ +1.1057960e+05 \ +1.1230760e+05 \ +1.1383820e+05 \ +1.0989510e+05 \ +1.0989510e+05 \ +1.1093110e+05 \ +1.1066950e+05 \ +1.0792940e+05 \ +1.1293990e+05 \ +1.0873260e+05 \ +1.1285050e+05 \ +1.1260890e+05 \ +1.1158310e+05 \ +1.1118290e+05 \ +1.1083870e+05 \ +1.1437020e+05 \ +1.0692730e+05 \ +1.1246260e+05 \ +1.0974440e+05 \ +1.1020880e+05 \ +1.1157370e+05 \ +1.0810080e+05 \ +1.0810080e+05 \ +1.0595190e+05 \ +1.0875770e+05 \ +1.1107200e+05 \ +1.0947720e+05 \ +1.0925970e+05 \ +1.0763510e+05 \ +1.0718900e+05 \ +1.0838230e+05 \ +1.0702720e+05 \ +1.0947720e+05 \ +1.1232670e+05 \ +1.1092220e+05 \ +1.1432260e+05 \ +1.1119430e+05 \ +1.1385020e+05 \ +1.0946460e+05 \ +1.0946460e+05 \ +1.1078560e+05 \ +1.0933960e+05 \ +1.1014950e+05 \ +1.0851560e+05 \ +1.0750430e+05 \ +1.1368350e+05 \ +1.1074090e+05 \ +1.1131230e+05 \ +1.0883790e+05 \ +1.1077910e+05 \ +1.1404250e+05 \ +1.1415900e+05 \ +1.1178500e+05 \ +1.1099060e+05 \ +1.1202550e+05 \ +1.1202550e+05 \ +1.0932060e+05 \ +1.0868990e+05 \ +1.1091210e+05 \ +1.1033400e+05 \ +1.0757670e+05 \ +1.0621390e+05 \ +1.0898650e+05 \ +1.0750430e+05 \ +1.0951780e+05 \ +1.0930090e+05 \ +1.1289990e+05 \ +1.0904670e+05 \ +1.0970100e+05 \ +1.0530200e+05 \ +1.0768800e+05 \ +1.0784010e+05 \ +1.0784010e+05 \ +# 1.1687510e+05 \ +1.0818520e+05 \ +1.1129860e+05 \ +1.0883610e+05 \ +1.0567990e+05 \ +1.0799570e+05 \ +1.1370440e+05 \ +1.1081100e+05 \ +1.0687400e+05 \ +1.0821130e+05 \ +1.1052730e+05 \ +1.1274910e+05 \ +1.1447740e+05 \ +1.1208630e+05 \ +1.1208660e+05 \ +1.1126310e+05 \ +1.1295850e+05 \ +1.1253850e+05 \ +1.1253850e+05 \ +1.1361220e+05 \ +1.1042730e+05 \ +1.0756410e+05 \ +1.0995260e+05 \ +1.0734620e+05 \ +1.0995960e+05 \ +1.0630780e+05 \ +1.0562090e+05 \ +1.1214760e+05 \ +1.0900220e+05 \ +1.0983730e+05 \ +# 1.0301380e+05 \ +1.0830400e+05 \ +1.1114190e+05 \ +1.1045950e+05 \ +1.1045950e+05 \ +1.0558880e+05 \ +1.0863220e+05 \ +1.1296920e+05 \ +1.1067110e+05 \ +1.1064970e+05 \ +1.0747900e+05 \ +1.0868990e+05 \ +1.0818520e+05 \ +1.1212610e+05 \ +1.0907620e+05 \ +1.0774650e+05 \ +1.0771450e+05 \ +1.0683550e+05 \ +1.0742630e+05 \ +1.0955030e+05 \ +1.0959580e+05 \ +1.0959930e+05 \ +1.0959930e+05 \ +1.0680850e+05 \ +1.1154360e+05 \ +1.0963600e+05 \ +1.0850120e+05 \ +1.1044870e+05 \ +1.0912900e+05 \ +1.0854720e+05 \ +1.0924210e+05 \ +1.1083070e+05 \ +1.1138750e+05 \ +1.0866600e+05 \ +1.0589740e+05 \ +1.0796360e+05 \ +1.0710370e+05 \ +1.1123400e+05 \ +1.1123400e+05 \ +1.0690680e+05 \ +1.0752410e+05 \ +1.0852770e+05 \ +1.0740470e+05 \ +1.1166460e+05 \ +1.1145210e+05 \ +1.1077650e+05 \ +1.1018900e+05 \ +1.1052960e+05 \ +1.0883610e+05 \ +1.0789150e+05 \ +1.0818520e+05 \ +1.0818520e+05 \ +1.1169420e+05 \ +1.1164440e+05 \ +1.0967000e+05 \ +1.1133340e+05 \ +1.1226710e+05 \ +1.0675740e+05 \ +1.0808050e+05 \ +1.0918920e+05 \ +1.0868230e+05 \ +1.1016060e+05 \ +1.1041730e+05 \ +1.1023730e+05 \ +1.1100740e+05 \ +1.1205520e+05 \ +1.1089150e+05 \ +1.0894350e+05 \ +1.1429490e+05 \ +1.1073030e+05 \ +1.1073030e+05 \ +1.1268820e+05 \ +1.1234690e+05 \ +1.1155380e+05 \ +1.1118290e+05 \ +1.1194590e+05 \ +1.0846200e+05 \ +1.1072110e+05 \ +1.1245130e+05 \ +1.1020010e+05 \ +1.1111590e+05 \ +1.1237900e+05 \ +1.0878910e+05 \ +1.0802250e+05 \ +1.1162490e+05 \ +1.1119430e+05 \ +1.1370130e+05 \ +1.1450100e+05 \ +1.1450100e+05 \ +# 1.1812230e+05 \ +1.1080960e+05 \ +1.1444040e+05 \ +# 1.1815400e+05 \ +# 1.1904360e+05 \ +1.1419230e+05 \ +1.1258890e+05 \ +1.1042890e+05 \ +1.1018690e+05 \ +# 1.0261100e+05 \ +# 1.0197200e+05 \ +1.0829650e+05 \ +1.0849990e+05 \ +1.0757670e+05 \ +1.1039700e+05 \ +1.1039700e+05 \ +1.1061010e+05 \ +1.0929220e+05 \ +1.1158740e+05 \ +1.1070490e+05 \ +1.0880860e+05 \ +1.1466440e+05 \ +# 1.0608290e+05 \ +1.1036820e+05 \ +1.0744000e+05 \ +1.0869760e+05 \ +1.0791110e+05 \ +1.0791110e+05 \ +1.1162290e+05 \ +1.1095090e+05 \ +1.1092270e+05 \ +1.1285990e+05 \ +1.0736560e+05 \ +1.1092440e+05 \ +1.1281500e+05 \ +1.0981110e+05 \ +1.1131120e+05 \ +1.1131120e+05 \ +1.1411910e+05 \ +1.1141230e+05 \ +1.1204570e+05 \ +1.1138710e+05 \ +1.1622860e+05 \ +1.0998970e+05 \ +1.1520510e+05 \ +1.0674870e+05 \ +1.1067860e+05 \ +1.1307980e+05 \ +1.1459510e+05 \ +1.1476880e+05 \ +1.0846530e+05 \ +1.0846530e+05 \ +1.1212650e+05 \ +1.1159270e+05 \ +1.1005780e+05 \ +1.1300740e+05 \ +1.1467210e+05 \ +1.1582680e+05 \ +1.1051720e+05 \ +1.0952450e+05 \ +1.1049910e+05 \ +1.0999660e+05 \ +1.1168400e+05 \ +1.1525340e+05 \ +1.1253860e+05 \ +1.1253860e+05 \ +1.1488790e+05 \ +1.1236680e+05 \ +1.1100850e+05 \ +1.0992360e+05 \ +1.0928080e+05 \ +# 1.1714310e+05 \ +1.0933990e+05 \ +1.1592440e+05 \ +1.1480290e+05 \ +1.1036630e+05 \ +1.1081880e+05 \ +1.1274370e+05 \ +1.1319400e+05 \ +1.1554970e+05 \ +1.1477070e+05 \ +1.1203790e+05 \ +1.1166410e+05 \ +1.1166410e+05 \ +1.1700490e+05 \ +1.0949780e+05 \ +1.1426090e+05 \ +1.1268380e+05 \ +1.1615560e+05 \ +1.0789870e+05 \ +1.0969650e+05 \ +1.1244900e+05 \ +1.1007570e+05 \ +# 1.1850700e+05 \ +1.1076990e+05 \ +1.1090900e+05 \ +1.0995710e+05 \ +1.1080830e+05 \ +1.1195580e+05 \ +1.1462640e+05 \ +1.1438640e+05 \ +1.1438640e+05 \ +1.1154320e+05 \ +1.1533580e+05 \ +1.1014730e+05 \ +1.1441190e+05 \ +1.1024080e+05 \ +1.1440370e+05 \ +1.1171390e+05 \ +1.1021760e+05 \ +1.1579590e+05 \ +1.0967390e+05 \ +1.1306300e+05 \ +1.1419600e+05 \ +1.1133340e+05 \ +1.1376640e+05 \ +1.1223740e+05 \ +1.1223740e+05 \ +1.1493160e+05 \ +1.1195600e+05 \ +1.1410690e+05 \ +1.0886930e+05 \ +1.1400790e+05 \ +1.1542930e+05 \ +1.1351690e+05 \ +1.0941460e+05 \ +1.1422910e+05 \ +1.1127610e+05 \ +1.1457950e+05 \ +1.1445720e+05 \ +1.1322510e+05 \ +1.1377780e+05 \ +1.1409840e+05 \ +1.0810080e+05 \ +1.0810080e+05 \ +1.1242810e+05 \ +1.1226760e+05 \ +1.1375630e+05 \ +1.1069850e+05 \ +1.1242810e+05 \ +1.1362440e+05 \ +1.1015610e+05 \ +1.1470580e+05 \ +1.1637250e+05 \ +1.1391590e+05 \ +1.1181510e+05 \ +1.0784230e+05 \ +1.0939210e+05 \ +1.1310320e+05 \ +1.1423230e+05 \ +1.1167870e+05 \ +1.1167870e+05 \ +1.1271970e+05 \ +1.1562990e+05 \ +1.1137390e+05 \ +1.1058870e+05 \ +1.0996820e+05 \ +1.1014950e+05 \ +1.1376640e+05 \ +1.0737470e+05 \ +1.1095090e+05 \ +1.1337210e+05 \ +1.1180510e+05 \ +1.1459140e+05 \ +1.1071560e+05 \ +1.0993280e+05 \ +1.0910500e+05 \ +1.0926100e+05 \ +1.0926100e+05 \ +1.1230670e+05 \ +1.1230670e+05 \ +1.1260250e+05 \ +1.1325230e+05 \ +1.1089520e+05 \ +1.1322680e+05 \ +1.1112760e+05 \ +1.0999530e+05 \ +1.1071300e+05 \ +1.1266790e+05 \ +1.0827090e+05 \ +1.1086110e+05 \ +1.1097080e+05 \ +1.1295060e+05 \ +1.1380530e+05 \ +1.1454220e+05 \ +1.1257850e+05 \ +# 1.0484600e+05 \ +# 1.0484600e+05 \ +1.1033960e+05 \ +1.0835640e+05 \ +1.1380530e+05 \ +1.1097280e+05 \ +1.0826210e+05 \ +1.1133190e+05 \ +1.1052540e+05 \ +1.1073540e+05 \ +1.1216570e+05 \ +1.0736070e+05 \ +1.0837480e+05 \ +1.0908980e+05 \ +1.0859970e+05 \ +1.0889240e+05 \ +1.1027160e+05 \ +1.1027160e+05 \ +1.0914500e+05 \ +1.0914500e+05 \ +1.0670360e+05 \ +1.1094050e+05 \ +1.1163460e+05 \ +1.1088090e+05 \ +1.1285970e+05 \ +1.1217760e+05 \ +1.0909050e+05 \ +1.0942780e+05 \ +1.1203990e+05 \ +1.1055600e+05 \ +1.1237630e+05 \ +1.1190460e+05 \ +1.0939850e+05 \ +1.0939850e+05 \ +1.0950000e+05 \ +1.1042190e+05 \ +1.0890810e+05 \ +1.0958180e+05 \ +1.1020240e+05 \ +1.0876960e+05 \ +1.0950000e+05 \ +1.1305440e+05 \ +1.1123290e+05 \ +1.0828430e+05 \ +1.1021760e+05 \ +1.1003860e+05 \ +1.1420590e+05 \ +1.1279980e+05 \ +1.1268920e+05 \ +1.1268920e+05 \ +1.1168880e+05 \ +1.1154360e+05 \ +1.1300130e+05 \ +1.1221610e+05 \ +1.0785240e+05 \ +1.0632540e+05 \ +1.1261850e+05 \ +1.1152380e+05 \ +1.0989510e+05 \ +1.1047230e+05 \ +1.0983590e+05 \ +1.0977530e+05 \ +1.0904300e+05 \ +1.1041100e+05 \ +1.1256800e+05 \ +1.1331190e+05 \ +1.1331190e+05 \ +1.1144300e+05 \ +1.1481320e+05 \ +1.1230630e+05 \ +1.1281040e+05 \ +1.0843730e+05 \ +1.1470190e+05 \ +1.0898090e+05 \ +1.1168450e+05 \ +1.1274260e+05 \ +# 1.0437090e+05 \ +1.1293860e+05 \ +1.0918430e+05 \ +1.1050990e+05 \ +1.0897870e+05 \ +1.0880880e+05 \ +1.1009770e+05 \ +1.1009770e+05 \ +1.0840950e+05 \ +1.0664490e+05 \ +1.1117250e+05 \ +1.1094430e+05 \ +1.1226690e+05 \ +1.1467210e+05 \ +1.1059030e+05 \ +1.0885570e+05 \ +1.0990770e+05 \ +1.0695240e+05 \ +1.0986830e+05 \ +1.1385900e+05 \ +1.1385900e+05 \ +1.1108240e+05 \ +1.1258800e+05 \ +1.0935920e+05 \ +# 1.1703980e+05 \ +1.1030890e+05 \ +1.0701080e+05 \ +1.1225670e+05 \ +1.1160330e+05 \ +1.1163500e+05 \ +1.1364450e+05 \ +1.1364450e+05 \ +1.1356290e+05 \ +1.1126650e+05 \ +1.0898090e+05 \ +1.0979920e+05 \ +1.1339210e+05 \ +1.0988800e+05 \ +1.1217760e+05 \ +1.0980070e+05 \ +1.0709000e+05 \ +1.1085420e+05 \ +1.1085420e+05 \ +1.0916460e+05 \ +1.0816560e+05 \ +1.1411550e+05 \ +1.0934770e+05 \ +1.1288920e+05 \ +1.1281850e+05 \ +1.0983590e+05 \ +1.0974880e+05 \ +1.0951960e+05 \ +1.0982880e+05 \ +1.0939850e+05 \ +1.0939530e+05 \ +1.0725660e+05 \ +1.0701740e+05 \ +1.1258890e+05 \ +1.0936740e+05 \ +1.0936740e+05 \ +1.0963310e+05 \ +1.1248770e+05 \ +1.0940930e+05 \ +1.1159910e+05 \ +1.0765460e+05 \ +1.0927370e+05 \ +1.0756410e+05 \ +1.1372370e+05 \ +1.1133270e+05 \ +1.0664540e+05 \ +1.1493970e+05 \ +1.1014950e+05 \ +1.0983590e+05 \ +1.1165490e+05 \ +1.0865410e+05 \ +1.0865410e+05 \ +1.1260800e+05 \ +1.0993280e+05 \ +1.0806820e+05 \ +1.1442030e+05 \ +1.1224710e+05 \ +1.1044970e+05 \ +1.1484470e+05 \ +1.1602410e+05 \ +1.0986830e+05 \ +1.1349370e+05 \ +1.0954590e+05 \ +1.1302750e+05 \ +1.1158340e+05 \ +1.1103350e+05 \ +1.1173400e+05 \ +# 1.0638250e+05 \ +1.1346260e+05 \ +1.1346260e+05 \ +1.1482310e+05 \ +1.1126220e+05 \ +1.1130810e+05 \ +1.1056500e+05 \ +1.0993280e+05 \ +# 9.7978340e+04 \ +# 9.5090230e+04 \ +# 9.9824350e+04 \ +1.1071390e+05 \ +1.0914500e+05 \ +1.0922500e+05 \ +1.0827120e+05 \ +1.1122260e+05 \ +1.0984860e+05 \ +1.1449270e+05 \ +1.1223660e+05 \ +1.1398770e+05 \ +1.1217620e+05 \ +1.1217620e+05 \ +1.1360430e+05 \ +1.1175390e+05 \ +1.1200580e+05 \ +1.1403660e+05 \ +1.1547890e+05 \ +# 1.2005440e+05 \ +1.1273040e+05 \ +1.1375630e+05 \ +1.1510130e+05 \ +1.1210710e+05 \ +1.1629490e+05 \ +1.1263020e+05 \ +# 1.1722490e+05 \ +1.1270150e+05 \ +1.1519770e+05 \ +1.1068510e+05 \ +1.1524560e+05 \ +1.1524560e+05 \ +1.1171390e+05 \ +1.1015490e+05 \ +1.1306140e+05 \ +1.1268900e+05 \ +1.1322310e+05 \ +1.0771620e+05 \ +1.1434160e+05 \ +1.1203560e+05 \ +1.1225730e+05 \ +1.1363570e+05 \ +1.1157330e+05 \ +1.1341420e+05 \ +1.0743680e+05 \ +1.1032670e+05 \ +1.1071040e+05 \ +1.1071040e+05 \ +1.0986260e+05 \ +1.1376510e+05 \ +1.1343920e+05 \ +1.1099060e+05 \ +1.1232690e+05 \ +1.1276920e+05 \ +1.0986420e+05 \ +# 1.0661230e+05 \ +1.0804200e+05 \ +1.1339210e+05 \ +1.1050810e+05 \ +1.1052790e+05 \ +1.0871300e+05 \ +1.1104590e+05 \ +1.0791770e+05 \ +1.0940350e+05 \ +1.0940350e+05 \ +1.1191040e+05 \ +1.1270370e+05 \ +1.1241750e+05 \ +# 1.0334310e+05 \ +# 1.0510780e+05 \ +1.1065140e+05 \ +1.1043970e+05 \ +1.1137250e+05 \ +1.0995960e+05 \ +1.0788640e+05 \ +1.1351070e+05 \ +1.0718070e+05 \ +1.0887530e+05 \ +1.0797620e+05 \ +1.1296920e+05 \ +1.0936410e+05 \ +1.0987680e+05 \ +1.1054040e+05 \ +1.1342110e+05 \ +1.1342110e+05 \ +1.1174410e+05 \ +1.0899450e+05 \ +1.1377860e+05 \ +1.1319100e+05 \ +1.0656650e+05 \ +1.1154410e+05 \ +1.1321320e+05 \ +1.1001020e+05 \ +1.0575860e+05 \ +1.1195560e+05 \ +1.1045060e+05 \ +1.1161340e+05 \ +1.1059030e+05 \ +1.0773400e+05 \ +1.0735390e+05 \ +1.0809850e+05 \ +1.0809850e+05 \ +1.0747220e+05 \ +1.1160330e+05 \ +1.1054040e+05 \ +1.0736790e+05 \ +1.0760300e+05 \ +1.0906450e+05 \ +1.1035580e+05 \ +1.0680300e+05 \ +1.1218590e+05 \ +1.1151410e+05 \ +1.0943970e+05 \ +1.0943970e+05 \ +1.1056170e+05 \ +1.0758350e+05 \ +1.0821970e+05 \ +1.1014090e+05 \ +1.0984010e+05 \ +1.0803990e+05 \ +1.0991890e+05 \ +1.1087250e+05 \ +1.0827960e+05 \ +1.1188490e+05 \ +1.0962940e+05 \ +1.0677000e+05 \ +1.1105210e+05 \ +1.1006930e+05 \ +1.0874860e+05 \ +1.0931980e+05 \ +1.0931980e+05 \ +1.0633880e+05 \ +1.0794410e+05 \ +1.0706740e+05 \ +1.0955350e+05 \ +1.0753440e+05 \ +1.0779800e+05 \ +1.0817220e+05 \ +# 1.0423620e+05 \ +1.0796980e+05 \ +1.1031640e+05 \ +1.1037020e+05 \ +# 1.0271120e+05 \ +1.0965030e+05 \ +1.1123390e+05 \ +1.0885570e+05 \ +1.0726330e+05 \ +1.0869760e+05 \ +1.0869760e+05 \ +1.0952610e+05 \ +1.0992160e+05 \ +1.1051890e+05 \ +1.1105210e+05 \ +1.0917630e+05 \ +1.1063310e+05 \ +1.1227660e+05 \ +1.1356180e+05 \ +1.0893550e+05 \ +1.0992580e+05 \ +1.1152840e+05 \ +1.1260800e+05 \ +1.1183490e+05 \ +1.1057230e+05 \ +1.0853520e+05 \ +1.0853520e+05 \ +1.0817300e+05 \ +1.1013850e+05 \ +1.1475050e+05 \ +1.1388310e+05 \ +1.1218590e+05 \ +1.1487300e+05 \ +1.1327230e+05 \ +1.1290130e+05 \ +1.1369060e+05 \ +1.1083310e+05 \ +1.1438240e+05 \ +1.1529530e+05 \ +1.1246080e+05 \ +1.1246080e+05 \ +1.1402090e+05 \ +1.1258510e+05 \ +1.0767410e+05 \ +# 1.0482600e+05 \ +# 9.8821820e+04 \ +# 1.0339850e+05 \ +1.1228640e+05 \ +1.1258800e+05 \ +1.0983740e+05 \ +1.0983740e+05 \ +1.1155380e+05 \ +1.1047750e+05 \ +1.0915660e+05 \ +1.0801180e+05 \ +1.1406580e+05 \ +1.1215210e+05 \ +1.1172840e+05 \ +1.1382140e+05 \ +1.1249800e+05 \ +1.0801000e+05 \ +1.1129290e+05 \ +1.1129290e+05 \ +1.1159320e+05 \ +# 1.0588190e+05 \ +1.0922560e+05 \ +1.1347940e+05 \ +1.1254890e+05 \ +1.1542460e+05 \ +1.1500790e+05 \ +1.1158310e+05 \ +1.1343430e+05 \ +1.1236760e+05 \ +1.1573140e+05 \ +1.1248900e+05 \ +1.1671730e+05 \ +1.1671730e+05 \ +1.0861260e+05 \ +1.0861260e+05 \ +1.1058480e+05 \ +1.1615690e+05 \ +1.1156320e+05 \ +1.1519720e+05 \ +1.1006690e+05 \ +# 1.1735740e+05 \ +1.1376710e+05 \ +1.1618800e+05 \ +1.1262890e+05 \ +1.1051720e+05 \ +1.1244810e+05 \ +1.0831140e+05 \ +# 1.1809870e+05 \ +# 1.1659370e+05 \ +1.0894350e+05 \ +1.1271970e+05 \ +1.1271970e+05 \ +1.1279040e+05 \ +1.1556000e+05 \ +1.0779960e+05 \ +1.1303980e+05 \ +1.1155800e+05 \ +1.1370480e+05 \ +1.1075010e+05 \ +1.1263970e+05 \ +1.1364280e+05 \ +1.0863880e+05 \ +1.1069090e+05 \ +1.1135330e+05 \ +1.1200990e+05 \ +1.0780760e+05 \ +1.1094670e+05 \ +1.0901790e+05 \ +1.0901790e+05 \ +1.0955890e+05 \ +1.1372130e+05 \ +1.1127260e+05 \ +1.1190460e+05 \ +1.0499120e+05 \ +1.0701080e+05 \ +1.0896690e+05 \ +1.1008670e+05 \ +1.0710340e+05 \ +1.0898260e+05 \ +1.0644890e+05 \ +1.0974880e+05 \ +1.0544620e+05 \ +1.0865080e+05 \ +1.0838810e+05 \ +1.1002990e+05 \ +1.1002990e+05 \ +1.0489380e+05 \ +# 1.0286260e+05 \ +# 1.0265780e+05 \ +1.0591670e+05 \ +1.0751010e+05 \ +1.1107310e+05 \ +1.0876540e+05 \ +1.1160560e+05 \ +1.0863130e+05 \ +1.0398360e+05 \ +1.0798140e+05 \ +1.0840160e+05 \ +1.0610990e+05 \ +1.1089150e+05 \ +1.1053810e+05 \ +1.1054700e+05 \ +1.0944660e+05 \ +1.0944660e+05 \ +1.0991890e+05 \ +1.0988230e+05 \ +1.0543700e+05 \ +1.0565950e+05 \ +1.0824420e+05 \ +1.0748390e+05 \ +1.0880100e+05 \ +1.0559080e+05 \ +1.0618890e+05 \ +1.0559620e+05 \ +1.0275770e+05 \ +1.0711270e+05 \ +1.0769360e+05 \ +1.0689000e+05 \ +1.0764080e+05 \ +1.0594050e+05 \ +1.0802760e+05 \ +1.0802760e+05 \ +1.0753680e+05 \ +1.0397330e+05 \ +1.0790330e+05 \ +1.0967310e+05 \ +1.0583710e+05 \ +1.0864210e+05 \ +# 1.0190030e+05 \ +1.0682560e+05 \ +1.0307960e+05 \ +1.0877730e+05 \ +1.0542760e+05 \ +1.0645560e+05 \ +1.0764080e+05 \ +1.1147510e+05 \ +1.0614280e+05 \ +1.0670360e+05 \ +1.0670360e+05 \ +# 1.1378050e+05 \ +1.0809850e+05 \ +1.0900220e+05 \ +1.0667550e+05 \ +# 1.0227900e+05 \ +1.0339770e+05 \ +1.0858460e+05 \ +1.0742340e+05 \ +1.0868120e+05 \ +1.0802040e+05 \ +1.0347610e+05 \ +1.0809850e+05 \ +1.0650230e+05 \ +1.0960470e+05 \ +1.0544690e+05 \ +1.0365350e+05 \ +1.0365350e+05 \ +1.0893950e+05 \ +1.0844200e+05 \ +1.0848100e+05 \ +1.1186490e+05 \ +1.0434330e+05 \ +1.0578480e+05 \ +1.0633880e+05 \ +1.0833080e+05 \ +1.0542760e+05 \ +1.0886350e+05 \ +1.0730250e+05 \ +1.0578120e+05 \ +1.0971230e+05 \ +1.0550020e+05 \ +1.1160560e+05 \ +1.0996230e+05 \ +1.1070000e+05 \ +1.0872900e+05 \ +1.0872900e+05 \ +1.0577660e+05 \ +1.1001020e+05 \ +1.0858770e+05 \ +1.1187510e+05 \ +1.0840160e+05 \ +1.0753770e+05 \ +1.0788970e+05 \ +1.0868990e+05 \ +1.0677370e+05 \ +1.1078810e+05 \ +1.1033960e+05 \ +1.1033960e+05 \ +1.1102430e+05 \ +1.1102430e+05 \ +1.0856970e+05 \ +1.1304240e+05 \ +1.0884790e+05 \ +1.0819740e+05 \ +1.1483510e+05 \ +1.0821700e+05 \ +1.1036460e+05 \ +1.1007370e+05 \ +1.1248690e+05 \ +1.0912180e+05 \ +1.1470190e+05 \ +1.1455930e+05 \ +1.1395610e+05 \ +1.1395610e+05 \ +1.1189470e+05 \ +1.1285990e+05 \ +1.1352490e+05 \ +1.1106090e+05 \ +1.1365920e+05 \ +1.1483260e+05 \ +# 1.1977260e+05 \ +1.1501370e+05 \ +# 1.1609030e+05 \ +1.0785470e+05 \ +1.0698500e+05 \ +# 9.9273530e+04 \ +# 9.2734640e+04 \ +# 9.7014920e+04 \ +1.0931520e+05 \ +1.0777850e+05 \ +1.0872490e+05 \ +1.0872490e+05 \ +1.1018690e+05 \ +1.1305980e+05 \ +1.1202550e+05 \ +1.1430650e+05 \ +1.1480910e+05 \ +1.1070000e+05 \ +1.1443710e+05 \ +1.1100190e+05 \ +1.1151830e+05 \ +1.1252680e+05 \ +1.1266380e+05 \ +1.1232810e+05 \ +1.1336020e+05 \ +1.0952110e+05 \ +1.0853520e+05 \ +1.0609830e+05 \ +1.0609830e+05 \ +1.1301850e+05 \ +1.1141290e+05 \ +1.1185480e+05 \ +1.1271770e+05 \ +1.1201560e+05 \ +1.1218590e+05 \ +1.0720360e+05 \ +1.0905850e+05 \ +1.0974880e+05 \ +1.0813440e+05 \ +1.0642360e+05 \ +1.0610410e+05 \ +1.0610410e+05 \ +1.0717090e+05 \ +1.1123290e+05 \ +1.0768800e+05 \ +1.0755040e+05 \ +1.1099130e+05 \ +1.0747900e+05 \ +1.0924950e+05 \ +1.0927020e+05 \ +1.1192030e+05 \ +1.0858730e+05 \ +1.0510430e+05 \ +1.0510430e+05 \ +1.1125270e+05 \ +1.1054940e+05 \ +1.1269870e+05 \ +1.0930090e+05 \ +1.1079200e+05 \ +# 1.1395610e+05 \ +# 1.1349370e+05 \ +# 1.1407530e+05 \ +# 1.0117850e+05 \ +# 9.4764450e+04 \ +# 8.8971340e+04 \ +# 8.1817020e+04 \ +# 8.1817020e+04 \ +# 7.9514520e+04 \ +# 7.4658690e+04 \ +# 7.2906820e+04 \ +# 7.4702950e+04 \ +# 7.2563320e+04 \ +# 6.7170910e+04 \ +# 6.7964210e+04 \ +# 6.7629860e+04 \ +# 6.9597940e+04 \ +# 7.0134870e+04 \ +# 7.0199210e+04 \ +# 7.1093280e+04 \ +# 6.9435120e+04 \ +# 6.9435120e+04 \ +# 8.1320570e+04 \ +# 8.8663800e+04 \ +# 9.9580970e+04 \ +# 1.0150090e+05 \ +1.0791760e+05 \ +1.1064540e+05 \ +# 1.1497650e+05 \ +1.1346340e+05 \ +1.1254810e+05 \ +1.0825000e+05 \ +1.0935310e+05 \ +1.0720080e+05 \ +1.1206510e+05 \ +1.1062430e+05 \ +1.0686120e+05 \ +1.1033070e+05 \ +1.1033070e+05 \ +1.0555570e+05 \ +1.0776600e+05 \ +# 1.1683440e+05 \ +1.1079200e+05 \ +1.1241750e+05 \ +1.1265840e+05 \ +1.1076490e+05 \ +1.1031980e+05 \ +1.0935590e+05 \ +1.0767700e+05 \ +1.1007240e+05 \ +1.1171850e+05 \ +1.1143270e+05 \ +1.0930700e+05 \ +1.1385830e+05 \ +1.1262940e+05 \ +1.0857760e+05 \ +1.0857760e+05 \ +1.0823920e+05 \ +1.1111390e+05 \ +1.1008040e+05 \ +1.1224690e+05 \ +1.1075160e+05 \ +1.1323960e+05 \ +# 1.1736210e+05 \ +1.1331190e+05 \ +1.1172420e+05 \ +1.1311980e+05 \ +# 1.1549760e+05 \ +1.0967000e+05 \ +1.1381170e+05 \ +1.1115070e+05 \ +1.1041100e+05 \ +1.1150860e+05 \ +1.1150860e+05 \ +1.0814330e+05 \ +1.1372370e+05 \ +1.1146280e+05 \ +1.0738150e+05 \ +1.0870530e+05 \ +1.0835520e+05 \ +1.0981760e+05 \ +1.1172420e+05 \ +1.1200550e+05 \ +1.1167440e+05 \ +1.1086110e+05 \ +1.1096970e+05 \ +1.1159320e+05 \ +1.1171400e+05 \ +1.1287050e+05 \ +1.1117250e+05 \ +1.0920190e+05 \ +1.0920190e+05 \ +1.1162450e+05 \ +1.0885180e+05 \ +1.0977690e+05 \ +1.0912530e+05 \ +1.0767220e+05 \ +1.0599510e+05 \ +1.0752750e+05 \ +# 1.0387140e+05 \ +1.0744370e+05 \ +# 1.0192100e+05 \ +# 9.9309860e+04 \ +# 1.0482680e+05 \ +# 9.9200820e+04 \ +# 1.0169960e+05 \ +# 1.0471490e+05 \ +# 1.0405560e+05 \ +1.0887530e+05 \ +1.1092060e+05 \ +1.1029800e+05 diff --git a/src/openalea/sequence_analysis/data/wij1.hsc b/src/openalea/sequence_analysis/data/wij1.hsc new file mode 100644 index 0000000..998c950 --- /dev/null +++ b/src/openalea/sequence_analysis/data/wij1.hsc @@ -0,0 +1,89 @@ +HIDDEN_SEMI-MARKOV_CHAIN + +8 STATES + +INITIAL_PROBABILITIES +0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 + +TRANSITION_PROBABILITIES +0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 +0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 +0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 +0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 +0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3 +0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 + +STATE 0 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 1 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 2 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 3 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 4 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 5 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +STATE 6 OCCUPANCY_DISTRIBUTION +NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05 + +1 OUTPUT_PROCESS + +OUTPUT_PROCESS 1 : NONPARAMETRIC + +STATE 0 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 + +STATE 1 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 2 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 3 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.1 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 4 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.3 +OUTPUT 1 : 0.1 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.2 +OUTPUT 4 : 0.2 + +STATE 5 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.2 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.3 +OUTPUT 4 : 0.1 + +STATE 6 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 0.2 +OUTPUT 1 : 0.3 +OUTPUT 2 : 0.2 +OUTPUT 3 : 0.1 +OUTPUT 4 : 0.2 + +STATE 7 OBSERVATION_DISTRIBUTION +OUTPUT 0 : 1.0 diff --git a/src/openalea/sequence_analysis/data/wij1.seq b/src/openalea/sequence_analysis/data/wij1.seq new file mode 100644 index 0000000..7b852e4 --- /dev/null +++ b/src/openalea/sequence_analysis/data/wij1.seq @@ -0,0 +1,75 @@ +1 VARIABLE + +VARIABLE 1 : INT # 5 values + +# value histogram - size of the sample: 1088 +# mean: 1.40625 variance: 1.49258 standard deviation: 1.22171 + +# | value histogram +# 0 284 latent bud +# 1 440 short shoot +# 2 36 long shoot +# 3 294 fruiting shoot +# 4 34 immediate shoot + +# sequence length histogram - size of the sample: 19 +# mean: 57.2632 variance: 8.64912 standard deviation: 2.94094 + +# cumulative length: 1088 + +1 1 2 1 1 1 1 1 1 1 3 1 3 0 3 3 3 0 3 3 1 0 0 4 4 0 4 3 3 3 3 0 3 3 1 3 3 1 3 0 0 \ +3 0 0 0 0 0 0 0 0 0 0 + +3 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 4 1 3 3 3 3 3 3 3 0 0 3 3 3 3 3 3 3 3 2 3 3 1 3 \ +1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 + +1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 0 0 0 0 0 0 0 0 0 4 4 4 4 3 4 3 3 3 3 3 3 1 1 \ +1 1 1 1 0 0 3 0 1 0 0 0 0 0 0 + +1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 4 3 1 3 3 3 3 3 3 3 0 0 3 3 0 3 0 3 3 3 3 1 0 1 1 \ +2 2 2 2 1 1 1 1 2 1 0 1 0 0 0 0 0 0 + +0 0 0 2 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 0 3 0 3 0 3 3 4 3 0 0 0 3 1 1 1 0 3 3 3 3 3 \ +3 1 1 1 2 1 0 1 0 4 0 0 0 0 0 0 0 + +1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 3 1 0 3 0 0 3 3 0 0 0 3 3 3 0 0 0 0 0 1 3 3 3 3 3 3 \ +3 3 3 3 1 1 1 1 3 3 0 0 0 0 0 0 0 0 0 0 + +0 0 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 3 0 0 0 3 3 1 0 0 1 1 1 1 3 3 3 3 1 1 1 1 \ +1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 + +0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 4 1 3 3 0 3 3 3 1 3 3 3 0 3 3 1 0 1 3 3 0 3 0 3 \ +1 1 2 1 1 1 1 2 1 1 1 1 1 0 0 0 0 0 + +1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 1 3 3 3 1 3 3 4 0 1 3 3 3 1 1 3 3 3 3 1 3 1 \ +1 1 1 1 0 1 1 0 3 3 2 1 0 0 0 0 0 0 + +2 1 1 1 1 1 1 1 3 1 3 3 3 3 1 0 3 1 1 0 0 0 0 4 0 1 0 1 3 3 3 3 1 3 1 1 3 0 1 1 1 \ +1 1 0 1 0 0 0 0 0 0 0 0 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 4 1 1 4 1 1 1 1 1 1 1 3 1 1 1 0 1 1 1 \ +1 1 2 1 1 1 1 3 2 0 0 0 0 0 0 0 0 0 + +1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 4 0 1 1 4 3 4 0 3 3 1 1 1 3 3 3 3 3 2 0 3 0 \ +1 1 1 1 2 2 1 1 1 1 2 1 1 1 0 0 0 0 + +0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 3 1 1 3 1 1 4 1 1 1 3 3 0 1 3 3 3 3 3 3 1 1 \ +1 1 2 2 1 2 2 1 2 0 2 2 1 0 0 0 0 0 0 0 0 + +0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 4 0 3 4 4 3 3 4 3 0 0 3 3 3 1 3 3 3 1 1 2 1 1 \ +1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 + +0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 3 4 0 1 0 0 3 4 1 0 3 1 1 0 3 3 0 3 3 1 3 1 1 \ +1 1 1 1 1 1 1 2 1 1 1 2 0 0 0 0 0 0 0 + +2 1 1 1 1 1 1 1 1 1 1 1 4 1 1 3 1 1 1 1 3 3 1 3 3 1 0 1 3 3 1 3 3 3 3 3 3 0 1 3 3 \ +3 3 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 + +1 1 1 1 1 1 0 1 3 1 3 2 3 1 3 3 3 3 3 4 3 0 0 0 0 0 3 0 3 3 3 3 3 3 3 3 3 3 3 3 3 \ +1 3 1 0 0 0 0 0 0 0 0 + +0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 3 1 3 3 0 0 4 0 0 0 3 0 3 3 3 3 3 3 3 3 3 \ +3 0 1 1 1 0 0 0 0 0 0 0 0 0 0 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 0 3 0 0 0 0 0 4 3 0 0 3 0 3 3 0 3 3 3 3 0 3 3 3 3 \ +1 0 0 0 0 0 0 0 0 0 0 0 diff --git a/src/wrapper/CMakeLists.txt b/src/wrapper/CMakeLists.txt new file mode 100644 index 0000000..5382584 --- /dev/null +++ b/src/wrapper/CMakeLists.txt @@ -0,0 +1,8 @@ +file(GLOB SOURCES "*.cpp") + + +target_sources( + _sequence_analysis + PRIVATE + ${SOURCES} +) diff --git a/src/wrapper/export_sequences.cpp b/src/wrapper/export_sequences.cpp index 998db6f..724bf11 100644 --- a/src/wrapper/export_sequences.cpp +++ b/src/wrapper/export_sequences.cpp @@ -1669,7 +1669,6 @@ class_sequences() Sequences(const Sequences &seq , char transform = 'c' , int param = DEFAULT); Sequences(const FrequencyDistribution &ilength_distribution , int inb_variable , bool init_flag = false); - Tops* tops(StatError &error) const; bool check(StatError &error , const char *pattern_label); std::ostream& line_write(std::ostream &os) const; diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/_test_variable_order_markov.py b/test/_test_variable_order_markov.py index 243b339..6abf1ad 100644 --- a/test/_test_variable_order_markov.py +++ b/test/_test_variable_order_markov.py @@ -19,8 +19,8 @@ import openalea.stat_tool.plot #import DISABLE_PLOT openalea.stat_tool.plot.DISABLE_PLOT = True -from tools import interface -from tools import runTestClass +from .tools import interface +from .tools import runTestClass from openalea.sequence_analysis import get_shared_data diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt new file mode 100644 index 0000000..e312222 --- /dev/null +++ b/test/cpp/CMakeLists.txt @@ -0,0 +1,37 @@ +if(NOT WITH_TEST) + return() +endif() + +# List all test files +file(GLOB TEST_FILES "*.cpp") + +# Loop over test files and create one executable per file +foreach(test_src ${TEST_FILES}) + # Remove the .cpp extension for the target name + get_filename_component(TEST_NAME ${test_src} NAME_WE) + + + add_executable(${TEST_NAME} ${test_src}) + + target_include_directories(${TEST_NAME} + PUBLIC + ${CONDA_ENV}include + ) + + find_library(STAT_TOOL_LIB NAMES oastat_tool) + list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) + + if("${isSystemDir}" STREQUAL "-1") + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") + endif("${isSystemDir}" STREQUAL "-1") + + link_directories("${CONDA_ENV}/lib") + target_link_directories(${TEST_NAME} PRIVATE "${CONDA_ENV}/lib") + # Link with your main library and GoogleTest (if used) + target_link_libraries(${TEST_NAME} PRIVATE oastat_tool) + target_link_libraries(${TEST_NAME} PRIVATE oasequence_analysis) + + # Register the test with CTest + add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) +endforeach() + diff --git a/test/cpp/test_hidden_semi_markov_chain.cpp b/test/cpp/test_hidden_semi_markov_chain.cpp index ee9b52e..fcfe383 100644 --- a/test/cpp/test_hidden_semi_markov_chain.cpp +++ b/test/cpp/test_hidden_semi_markov_chain.cpp @@ -23,17 +23,22 @@ int main(void) bool status, geometric_poisson=false, common_dispersion=false, counting_flag=true, state_sequence=true; const int nb_sequence = 30 , length = 100; + const stat_tool::process_type itype = stat_tool::ORDINARY; HiddenSemiMarkov *hsmc= NULL, *hsmc_ref= NULL, *hsmc_est_file= NULL; SemiMarkovData *hsmd= NULL; stat_tool::censoring_estimator estimator=stat_tool::COMPLETE_LIKELIHOOD; // Hidden_variable_order_markov *hmc= NULL, *hmc_init= NULL; MultiPlotSet *plotable=NULL; MarkovianSequences *seq_estim= NULL; + Sequences *seq_read= NULL; StatError error; std::vector< int > select; - const char * hsmcrefpath= "../../share/data/test_hidden_semi_markov_param.dat"; - // const char * hmcinitpath= "./hmc_init.hvom"; - + const char * hsmcrefpath= "../../../share/data/test_hidden_semi_markov_param.dat"; + const char * data_fail= "../../../test/lippia_fail.seq"; + const char * hsmcTC00LRpath = "../../../test/TC00LR_4S_init.hscm"; + const char * hsmcTC00Irpath = "../../../test/TC00Ir_4S_init.hscm"; + + /* // reading and printing of a hidden Markov out tree hsmc_ref = HiddenSemiMarkov::ascii_read(error, hsmcrefpath); cout << error; @@ -89,7 +94,63 @@ int main(void) delete hsmc_est_file; } hsmc_est_file = NULL; +*/ + // Test behaviour in case of convergence failure + seq_read = Sequences::ascii_read(error, data_fail); + cout << error; + seq_estim = new MarkovianSequences(*seq_read); +/* + cout << "Estimate default from lippia_fail.seq" << endl; + hsmc = seq_estim->hidden_semi_markov_estimation(error, &cout, itype, 4, true, stat_tool::D_DEFAULT, geometric_poisson , common_dispersion, estimator, counting_flag, state_sequence, 300); + if (hsmc != NULL) { + cout << "Estimated model:" << endl; + hsmc->ascii_write(cout); + delete hsmc; + hsmc = NULL; + } + + + // Variant: using LR initial model + hsmc_ref = HiddenSemiMarkov::ascii_read(error, hsmcTC00LRpath); + if (hsmc_ref != NULL) { + cout << "Estimate file init from lippia_fail.seq" << endl; + hsmc_est_file = seq_estim->hidden_semi_markov_estimation(error, &cout, *hsmc_ref, geometric_poisson , common_dispersion, estimator, counting_flag, state_sequence, 300); + if (hsmc_est_file != NULL) { + cout << "Estimated model:" << endl; + hsmc_est_file->ascii_write(cout); + plotable = hsmc_est_file->get_plotable(); + delete plotable; + delete hsmc_est_file; + hsmc_est_file = NULL; + } + delete hsmc_ref; + hsmc_ref = NULL; + } +*/ + // Variant: using Irreducible initial model + hsmc_ref = HiddenSemiMarkov::ascii_read(error, hsmcTC00Irpath); + if (hsmc_ref != NULL) { + cout << "Estimate file init from lippia_fail.seq" << endl; + hsmc_est_file = seq_estim->hidden_semi_markov_estimation(error, &cout, *hsmc_ref, geometric_poisson , common_dispersion, estimator, counting_flag, state_sequence, 300); + if (hsmc_est_file != NULL) { + cout << "Estimated model:" << endl; + hsmc_est_file->ascii_write(cout); + plotable = hsmc_est_file->get_plotable(); + delete plotable; + hsmd = hsmc_est_file->extract_data(error); + cout << error; + assert(hsmd); + delete hsmd; + hsmd = NULL; + delete hsmc_est_file; + hsmc_est_file = NULL; + } + delete hsmc_ref; + hsmc_ref = NULL; + } + delete seq_estim; + delete seq_read; return 0; } diff --git a/test/functional1.py b/test/functional1.py deleted file mode 100644 index ef057bb..0000000 --- a/test/functional1.py +++ /dev/null @@ -1,97 +0,0 @@ -""" functional tests - - -.. todo:: to be done -""" -__revision__ = "$Id$" - -import os -from openalea.stat_tool import * -from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data - -seq1 = Sequences(str(get_shared_data( 'dupreziana_20a2.seq'))) # correct -seq2 = RemoveRun(seq1, 1, 0, "End") # correct - -histo21 = ExtractHistogram(seq2, "Recurrence", 1) # correct -histo22 = ExtractHistogram(seq2, "Recurrence", 2) # correct - -seq3 = Sequences(str(get_shared_data( 'dupreziana_40a2.seq'))) #correct -seq4_0 = RemoveRun(seq3, 2, 0, "End") #correct -seq4 = SegmentationExtract(seq4_0, 1, 2) #correct - - -seq5 = Sequences(str(get_shared_data( 'dupreziana_60a2.seq'))) #correct -seq6_0 = RemoveRun(seq5, 2, 0, "End") #correct -seq6 = LengthSelect(SegmentationExtract(seq6_0, 1, 2), 1, Mode="Reject") #correct - - -seq7 = Sequences(str(get_shared_data( 'dupreziana_80a2.seq'))) #correct -seq8_0 = RemoveRun(seq7, 2, 0, "End") #correct -seq8 = SegmentationExtract(seq8_0, 1, 2) #correct - - -seq10 = Merge(seq2, seq4, seq6, seq8) - -seq10_1 = RecurrenceTimeSequences(seq10,1) -seq10_2 = RecurrenceTimeSequences(seq10,2) - - -vec10 = MergeVariable(ExtractVectors(seq10, "Length"),ExtractVectors(seq10, "NbOccurrence",1,1),ExtractVectors(seq10, "NbOccurrence",1,2),ExtractVectors(seq10, "Cumul")) - -seq11 = Transcode(seq10, [0, 1, 0]) -seq12 = Transcode(seq10, [0, 0, 1]) - -acf1 = Merge(ComputeCorrelation(seq11, MaxLag=15), ComputeCorrelation(seq12, MaxLag=15)) - -acf2 = Merge(ComputeCorrelation(seq11, Type="Spearman", MaxLag=15), - ComputeCorrelation(seq12, Type="Spearman", MaxLag=15)) -acf3 = Merge(ComputeCorrelation(seq11, Type="Kendall", MaxLag=15), - ComputeCorrelation(seq12, Type="Kendall", MaxLag=15)) - - - -WordCount(seq10, 3, BeginState=1, EndState=1, MinFrequency=10) -WordCount(seq10, 4, BeginState=2, EndState=2) -WordCount(seq10, 4, BeginState=2, EndState=1) - - - -mc10 = Estimate(seq10, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=5, GlobalInitialTransition=True) - -mc11 = Estimate(seq10, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=5, GlobalInitialTransition=False) - -Plot(mc11, "Intensity") - -mc12 = Estimate(seq10, "VARIABLE_ORDER_MARKOV", "Ordinary", Algorithm="LocalBIC", Threshold=10., MaxOrder=5, GlobalInitialTransition=False, GlobalSample=False) -mc13 = Estimate(seq10, "VARIABLE_ORDER_MARKOV", "Ordinary", Algorithm="Context", Threshold=1., MaxOrder=5, GlobalInitialTransition=False, GlobalSample=False) - -acf11 = ComputeAutoCorrelation(mc11, 1, MaxLag=20) -acf12 = ComputeAutoCorrelation(mc11, 2, MaxLag=20) - -mc2 = Estimate(seq2, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) -mc4 = Estimate(seq4, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) -mc6 = Estimate(seq6, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) -mc8 = Estimate(seq8, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) - - -#TODO compare functions crashes sometimes -#matrix1 = Compare(Thresholding(mc2, MinProbability=0.001), seq10, Thresholding(mc4, MinProbability=0.001), seq10, Thresholding(mc6, MinProbability=0.001), seq10, Thresholding(mc8, MinProbability=0.001), seq10, 10000) -#matrix2 = Compare(Thresholding(mc2, MinProbability=0.001), seq2, Thresholding(mc4, MinProbability=0.001), seq4, Thresholding(mc6, MinProbability=0.001), seq6, Thresholding(mc8, MinProbability=0.001), seq8, 10000) - - -#Compare(seq10, Thresholding(mc2, MinProbability=0.001), Thresholding(mc4, MinProbability=.001), Thresholding(mc6, MinProbability=0.001), Thresholding(mc8, MinProbability=0.001)) - - - -# test # -hmc9 = HiddenVariableOrderMarkov(str(get_shared_data( "dupreziana21.hc"))) -hmc10 = Estimate(seq10, "HIDDEN_VARIABLE_ORDER_MARKOV", hmc9, GlobalInitialTransition=True, NbIteration=80) -hmc11 = Estimate(seq10, "HIDDEN_VARIABLE_ORDER_MARKOV", hmc9, GlobalInitialTransition=False, NbIteration=80) - - -acf21 = ComputeAutoCorrelation(hmc11, 1, 1, MaxLag=20) -acf22 = ComputeAutoCorrelation(hmc11, 1, 2, MaxLag=20) - -seq15 = Simulate(hmc11, 10000, seq10) - diff --git a/test/functional2.py b/test/functional2.py deleted file mode 100644 index f467d2c..0000000 --- a/test/functional2.py +++ /dev/null @@ -1,141 +0,0 @@ -""" functional tests - -""" -__revision__ = "$Id$" - - - -from openalea.sequence_analysis import * -from openalea.sequence_analysis.estimate import Estimate -from openalea.sequence_analysis.compare import Compare -from tools import runTestClass, robust_path as get_shared_data - - -seq20 = Sequences(str(get_shared_data("belren1.seq"))) -seq21 = Sequences(str(get_shared_data("elstar1.seq"))) -seq22 = Sequences(str(get_shared_data("fuji1.seq"))) -seq23 = Sequences(str(get_shared_data("gala1.seq"))) -seq24 = Sequences(str(get_shared_data("granny1.seq"))) -seq25 = Sequences(str(get_shared_data("reinet1.seq"))) -seq26 = Sequences(str(get_shared_data("wij1.seq"))) - -Display(seq25, ViewPoint="Data") -Plot(seq25, "Intensity") -Plot(seq25, "Sojourn") - -seq26 = Reverse(seq25) -Plot(seq26, "Intensity") -Plot(seq26, "FirstOccurrence") - -# Sojourn time (run length) distributions - -seq30 = Merge(seq20, seq21, seq22, seq23, seq24, seq25) -Plot(seq30, "Sojourn") -Plot(ExtractHistogram(seq30, "Sojourn", 1), ExtractHistogram(seq30, "Sojourn", 2), ExtractHistogram(seq30, "Sojourn", 3), ExtractHistogram(seq30, "Sojourn", 4)) - -mc30 = Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=4, GlobalInitialTransition=False) -mc30 = Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=4, Algorithm="BIC", GlobalInitialTransition=False) -#todo empty plot -#Plot(mc30, "Sojourn") -Display(Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=1)) -Display(Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=2, GlobalInitialTransition=False)) - -seq31 = Cluster(seq30, "Limit", [1, 4]) -mc31 = Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=4, GlobalInitialTransition=False) -mc31 = Estimate(seq31, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=2, GlobalInitialTransition=False) -Plot(mc31, "Sojourn") -Display(Estimate(seq31, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=1)) - -# comparison of sequences by dynamic programming algorithms - -seq32 = Merge(seq20, seq25) -matrix30 = Compare(seq32) -matrix31 = Compare(seq32, VectorDistance("S")) -matrix32 = Compare(seq32, VectorDistance("S"), Transposition=True) -matrix33 = Compare(seq32, VectorDistance(str(get_shared_data("test_align1.a"))), Transposition=True) - -Display(Clustering(matrix33, "Partition", 2)) -Clustering(matrix33, "Hierarchy", Algorithm="Agglomerative") -Clustering(matrix33, "Hierarchy", Algorithm="Divisive") - -# multiple alignment - -seq33 = Compare(SelectIndividual(seq25, [10, 11, 12, 14, 15]), VectorDistance("S"), Output="Sequences", Algorithm="Agglomerative") -seq34 = Compare(SelectIndividual(seq25, [10, 11, 12, 14, 15]), VectorDistance("S"), Output="Sequences", Algorithm="Divisive") -seq35 = Compare(SelectIndividual(seq25, [10, 11, 12, 14, 15]), VectorDistance("S"), Output="Sequences", Algorithm="Ordering") - -Compare(seq25, TestSequence=9, RefSequence=1) -Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1) -Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1, Transposition=True) - -# multiple change-point models - -Display(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile") -Display(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile", Output="ChangePoint") -Plot(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile") -Plot(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile", Output="ChangePoint") -# hidden semi-Markov chains - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("belren1.hsc"))) -hsmc20 = Estimate(seq20, "HIDDEN_SEMI-MARKOV", hsmc0) - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("elstar1.hsc"))) -hsmc21 = Estimate(seq21, "HIDDEN_SEMI-MARKOV", hsmc0) - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("fuji1.hsc"))) -hsmc22 = Estimate(seq22, "HIDDEN_SEMI-MARKOV", hsmc0) - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("gala1.hsc"))) -hsmc23 = Estimate(seq23, "HIDDEN_SEMI-MARKOV", hsmc0) - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("granny1.hsc"))) -hsmc24 = Estimate(seq24, "HIDDEN_SEMI-MARKOV", hsmc0) - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("reinet1.hsc"))) -hsmc25 = Estimate(seq25, "HIDDEN_SEMI-MARKOV", hsmc0) - -Display(hsmc25) -Plot(hsmc25, "Intensity", 1) -Plot(hsmc25, "FirstOccurrence", 1) -Plot(hsmc25, "Counting", 1) - -# state -Plot(hsmc25, "Intensity") -Plot(hsmc25, "Sojourn") -# observed -Plot(hsmc25, "Sojourn",1) - -Plot(hsmc25, 1, ViewPoint="StateProfile") -Plot(hsmc25, 1, ViewPoint="StateProfile", Output='InState') -Plot(hsmc25, 1, ViewPoint="StateProfile", Output='OutState') - -seq25_1 = ExtractData(hsmc25) -Display(seq25_1, ViewPoint="Data", Format="Line") - -hsmc0 = HiddenSemiMarkov(str(get_shared_data("wij1.hsc"))) -hsmc26 = Estimate(seq26, "HIDDEN_SEMI-MARKOV", hsmc0) - -# model comparison - -#Thresholding(hsmc20, MinProbability=0.001) -#Thresholding(hsmc21, MinProbability=0.001) -#Thresholding(hsmc22, MinProbability=0.001) -#Thresholding(hsmc23, MinProbability=0.001) -#Thresholding(hsmc24, MinProbability=0.001) -#Thresholding(hsmc25, MinProbability=0.001) -#Thresholding(hsmc26, MinProbability=0.001) - - -#matrix20 = Compare(Thresholding(hsmc22, MinProbability=0.001), seq22, 10000) - -#matrix20 = Compare(Thresholding(hsmc20, MinProbability=0.001), seq20, Thresholding(hsmc21, MinProbability=0.001), seq21, Thresholding(hsmc22, MinProbability=0.001), seq22, Thresholding(hsmc24, MinProbability=0.001), seq24, Thresholding(hsmc25, MinProbability=0.001), seq25, Thresholding(hsmc26, MinProbability=0.001), seq26, 10000) - -#TODO unstable the line above works, the line below does not -#matrix20 = Compare(Thresholding(hsmc20, MinProbability=0.001), seq20, Thresholding(hsmc21, MinProbability=0.001), seq21, Thresholding(hsmc22, MinProbability=0.001), seq22, Thresholding(hsmc23, MinProbability=0.001), seq23, Thresholding(hsmc24, MinProbability=0.001), seq24, Thresholding(hsmc25, MinProbability=0.001), seq25, Thresholding(hsmc26, MinProbability=0.001), seq26, 10000, FileName="ASCII/cultivar1_models.txt") - -# may be slow -#matrix21 = Compare(Thresholding(hsmc20, MinProbability=0.001), Thresholding(hsmc21, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc24, MinProbability=0.001), Thresholding(hsmc25, MinProbability=0.001), Thresholding(hsmc26, MinProbability=0.001), 100, 90) -#matrix21 = Compare(Thresholding(hsmc20, MinProbability=0.001), Thresholding(hsmc21, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc24, MinProbability=0.001), Thresholding(hsmc25, MinProbability=0.001), Thresholding(hsmc26, MinProbability=0.001), 100, 90, FileName="ASCII/cultivar1_models_90.txt") - - -#Plot(matrix20) diff --git a/test/test_add_absorbing_run.py b/test/test_add_absorbing_run.py index 2f1754f..a80c1c3 100644 --- a/test/test_add_absorbing_run.py +++ b/test/test_add_absorbing_run.py @@ -1,93 +1,136 @@ """tests on the method AddAbsorbingRun -.. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr +.. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr -.. todo:: markov case ? +.. todo:: markov case ? """ + __revision__ = "$Id$" +import pytest + +from dataclasses import dataclass +from typing import Any + from openalea.sequence_analysis.sequences import Sequences from openalea.sequence_analysis.semi_markov import SemiMarkov from openalea.sequence_analysis.data_transform import AddAbsorbingRun -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import get_shared_data + +MAX_RUN_LENGTH = 20 # hardcoded values in CPP code + + +@dataclass +class AbsorbingData: + data: Any + max_length: float + max_run_length: float + + +@pytest.fixture(params=["raw", "sequences", "semimarkov"]) +def AddAbsorbingRunData(request): + if request.param == "raw": + return AbsorbingData(None, -1, 20) + elif request.param == "sequences": + return Sequences(str(get_shared_data("sequences1.seq"))) + elif request.param == "semimarkov": + markov = SemiMarkov(str(get_shared_data("test_semi_markov.dat"))) + return markov.simulation_nb_elements(1, 1000, True) -class _AddAbsorbingRun(): + +class TestAddAbsorbingRun: """ - a main class to test the AddAbsorbingrun function on different type of + a main class to test the AddAbsorbingrun function on different type of data structure. - + """ - def __init__(self): - self.data = None - self.max_length = -1 - self.MAX_RUN_LENGTH = 20 # hardcoded values in CPP code - - def test_max_length(self): - seq = self.data + def test_max_length(self, AddAbsorbingRunData): + seq = AddAbsorbingRunData.data assert seq.max_length == self.max_length - - - def test_boost_versus_module(self): - seq = self.data + + def test_boost_versus_module(self, AddAbsorbingRunData): + seq = AddAbsorbingRunData.data sequence_length = -1 run_length = 6 - + boost = seq.add_absorbing_run(sequence_length, run_length) - module1 = AddAbsorbingRun(seq, - SequenceLength=sequence_length, - RunLength=run_length) + module1 = AddAbsorbingRun( + seq, SequenceLength=sequence_length, RunLength=run_length + ) module2 = AddAbsorbingRun(seq, RunLength=run_length) - assert str(module1)==str(boost) - assert str(module2)==str(boost) - - def test_no_arguments(self): - seq = self.data + assert str(module1) == str(boost) + assert str(module2) == str(boost) + + def test_no_arguments(self, AddAbsorbingRunData): + seq = AddAbsorbingRunData.data assert AddAbsorbingRun(seq) - - def test_wrong_run_length(self): - seq = self.data + + def test_wrong_run_length(self, AddAbsorbingRunData): + seq = AddAbsorbingRunData.data try: - #second arguments must be less than MAX_RU_LENGTH - _res = AddAbsorbingRun(seq, -1, self.MAX_RUN_LENGTH + 1) + # second arguments must be less than MAX_RU_LENGTH + _res = AddAbsorbingRun(seq, -1, AddAbsorbingRunData["MAX_RUN_LENGTH"] + 1) assert False except Exception: assert True - def test_wrong_sequence_length(self): - seq = self.data + def test_wrong_sequence_length(self, AddAbsorbingRunData): + seq = AddAbsorbingRunData.data try: - #second arguments must be less than MAX_RU_LENGTH - _res = AddAbsorbingRun(seq, self.max_length -1, -1) + # second arguments must be less than MAX_RU_LENGTH + _res = AddAbsorbingRun(seq, AddAbsorbingRunData["max_length"] - 1, -1) assert False except Exception: assert True -class Test_AddAbsorbingRun_Sequences(_AddAbsorbingRun): - """sequences case""" - def __init__(self): - _AddAbsorbingRun.__init__(self) - self.data = self.create_data() - self.max_length = 30 - - def create_data(self): - seq = Sequences(str(get_shared_data('sequences1.seq'))) - return seq - -class Test_AddAbsorbingRun_SemiMarkov(_AddAbsorbingRun): - """semi markov case""" - def __init__(self): - _AddAbsorbingRun.__init__(self) - self.data = self.create_data() - self.max_length = 1000 - - def create_data(self): - markov = SemiMarkov(str(get_shared_data('test_semi_markov.dat'))) - semi_markov_data = markov.simulation_nb_elements(1, 1000, True) - return semi_markov_data - -if __name__ == "__main__": - runTestClass(Test_AddAbsorbingRun_Sequences()) - runTestClass(Test_AddAbsorbingRun_SemiMarkov()) - \ No newline at end of file + +@pytest.fixture +def seq(): + return Sequences(str(get_shared_data("sequences1.seq"))) + + +@pytest.fixture +def semi_markov(): + markov = SemiMarkov(str(get_shared_data("test_semi_markov.dat"))) + return markov.simulation_nb_elements(1, 1000, True) + + +def test_max_length_seq(seq): + assert seq.max_length == 30 + + +def test_boost_versus_module_seq(seq): + sequence_length = -1 + run_length = 6 + + boost = seq.add_absorbing_run(sequence_length, run_length) + module1 = AddAbsorbingRun(seq, SequenceLength=sequence_length, RunLength=run_length) + module2 = AddAbsorbingRun(seq, RunLength=run_length) + + assert str(module1) == str(boost) + assert str(module2) == str(boost) + + +def test_no_arguments_seq(seq): + assert AddAbsorbingRun(seq) + + +def test_wrong_run_length_seq(seq): + try: + # second arguments must be less than MAX_RU_LENGTH + _res = AddAbsorbingRun(seq, -1, MAX_RUN_LENGTH + 1) + assert False + except Exception: + assert True + + +def test_wrong_sequence_length_seq(seq): + try: + # second arguments must be less than MAX_RU_LENGTH + max_length = 30 + _res = AddAbsorbingRun(seq, max_length - 1, -1) + assert False + except Exception: + assert True diff --git a/test/test_build_auxialiary_variable.py b/test/test_build_auxialiary_variable.py index 03d610b..e6cd66a 100644 --- a/test/test_build_auxialiary_variable.py +++ b/test/test_build_auxialiary_variable.py @@ -1,5 +1,5 @@ from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data def test1(): seq6 = Sequences(str(get_shared_data("pin_laricio_6.seq"))) @@ -18,4 +18,4 @@ def test1(): Plot(SelectIndividual(seq31, [95]), ViewPoint="Data") if __name__ == "__main__": - test1() \ No newline at end of file + test1() diff --git a/test/test_cluster.py b/test/test_cluster.py index a75eee5..e3eabb9 100644 --- a/test/test_cluster.py +++ b/test/test_cluster.py @@ -1,198 +1,101 @@ -""" Cluster tests +"""Cluster tests .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo:: check the AddVariable option (sequences) and sequences cases """ + __revision__ = "$Id$" import os + +import pytest from openalea.sequence_analysis.sequences import Sequences -#from openalea.sequence_analysis.semi_markov import SemiMarkov + +# from openalea.sequence_analysis.semi_markov import SemiMarkov from openalea.stat_tool.cluster import Cluster from openalea.stat_tool.histogram import Histogram from openalea.stat_tool.convolution import Convolution from openalea.stat_tool.compound import Compound from openalea.stat_tool.vectors import Vectors -from tools import runTestClass, robust_path as get_shared_data - -class _Cluster(): - """Test class to test cluster function and classes - - create_data, cluster_step and cluster_limit funciton will be required - """ - - def __init__(self): - self.data = None - - def create_data(self): - raise NotImplemented - - def test_cluster_step(self): - raise NotImplemented - - def test_cluster_limit(self): - raise NotImplemented - -class _HistoCase(_Cluster): - """ - inherits from _cluster and implements the cluster_limit and cluster_step - functions. - - In addition, classes that inherits from _HistoCase must implement - cluster_information - """ - def __init__(self): - _Cluster.__init__(self) - self.data = None - - def test_cluster_step(self): - cluster1 = Cluster(self.data, "Step", 2) - cluster2 = self.data.cluster_step(2) - assert str(cluster1) == str(cluster2) - - def test_cluster_limit(self): - cluster1 = Cluster(self.data, "Limit", [2, 4, 6, 8, 10]) - cluster2 = self.data.cluster_limit([2, 4, 6, 8, 10]) - assert str(cluster1) == str(cluster2) - - def test_cluster_information(self): - cluster1 = Cluster(self.data, "Information", 0.8) - cluster2 = self.data.cluster_information(0.8) - assert str(cluster1) == str(cluster2) - - -class TestHistogram(_HistoCase): - - def __init__(self): - _HistoCase.__init__(self) - self.data = self.create_data() - - def create_data(self): - return Histogram(str(get_shared_data( 'fagus1.his'))) - - -class TestConvolution( _HistoCase): - - def __init__(self): - _HistoCase.__init__(self) - self.data = self.create_data() - - def create_data(self): - conv = Convolution(str(get_shared_data('test_convolution1.conv'))) - return conv.simulate(1000) - - -class TestCompound(_HistoCase): - - def __init__(self): - _HistoCase.__init__(self) - self.data = self.create_data() +from .tools import runTestClass, robust_path as get_shared_data - def create_data(self): - comp = Compound(str(get_shared_data('test_compound1.cd'))) - return comp.simulate(1000) +@pytest.fixture +def create_data_vectorsn(): + return Vectors([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) -class TestVectorsn(_Cluster): - def __init__(self): - _Cluster.__init__(self) - self.data = self.create_data() +def test_cluster_step_vectorsn(create_data_vectorsn): + data = create_data_vectorsn + cluster1 = data.cluster_step(1, 2) + cluster2 = Cluster(data, "Step", 1, 2) + assert str(cluster1) == str(cluster2) - def create_data(self): - v = Vectors([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) - return v - def test_cluster_step(self): - data = self.data - cluster1 = data.cluster_step(1, 2) - cluster2 = Cluster(data, "Step", 1, 2) - assert str(cluster1) == str(cluster2) +def test_cluster_limit_vectorsn(create_data_vectorsn): + data = create_data_vectorsn + cluster1 = data.cluster_limit(1, [2, 4, 6]) + cluster2 = Cluster(data, "Limit", 1, [2, 4, 6]) + assert str(cluster1) == str(cluster2) - def test_cluster_limit(self): - data = self.data - cluster1 = data.cluster_limit(1, [2, 4, 6]) - cluster2 = Cluster(data, "Limit", 1, [2, 4, 6]) - assert str(cluster1) == str(cluster2) -class TestVectors1(_Cluster): +@pytest.fixture +def create_data_vector1(): + return Vectors([[1], [1], [4]]) - def __init__(self): - _Cluster.__init__(self) - self.data = self.create_data() - def create_data(self): - v = Vectors([[1], [1], [4]]) - return v +def test_cluster_step_vector1(create_data_vector1): + data = create_data_vector1 + cluster1 = data.cluster_step(1, 2) + cluster2 = Cluster(data, "Step", 2) + assert str(cluster1) == str(cluster2) - def test_cluster_step(self): - data = self.data - cluster1 = data.cluster_step(1, 2) - cluster2 = Cluster(data, "Step", 2) - assert str(cluster1) == str(cluster2) - def test_cluster_limit(self): - data = self.data - cluster1 = data.cluster_limit(1, [2, 4, 6]) - cluster2 = Cluster(data, "Limit", [2, 4, 6]) - assert str(cluster1) == str(cluster2) +def test_cluster_limit_vector1(create_data_vector1): + data = create_data_vector1 + cluster1 = data.cluster_limit(1, [2, 4, 6]) + cluster2 = Cluster(data, "Limit", [2, 4, 6]) + assert str(cluster1) == str(cluster2) -class TestSequences1(_Cluster): +@pytest.fixture +def create_data_sequences1(): + return Sequences(str(get_shared_data("sequences1.seq"))) - def __init__(self): - _Cluster.__init__(self) - self.data = self.create_data() - def create_data(self): - data = Sequences(str(get_shared_data('sequences1.seq'))) - return data +def test_cluster_step_sequences1(create_data_sequences1): + data = create_data_sequences1 + mode = False + cluster1 = data.cluster_step(1, 2, mode) + cluster2 = Cluster(data, "Step", 2) + assert str(cluster1) == str(cluster2) - def test_cluster_step(self): - data = self.data - mode = False - cluster1 = data.cluster_step(1, 2, mode) - cluster2 = Cluster(data, "Step", 2) - assert str(cluster1) == str(cluster2) - def test_cluster_limit(self): - data = self.data - print(data.nb_variable) - cluster1 = data.cluster_limit(1,[2], False) - cluster2 = Cluster(data,"Limit", [2] , AddVariable=False) - assert str(cluster1) == str(cluster2) +def test_cluster_limit_sequences1(create_data_sequences1): + data = create_data_sequences1 + print(data.nb_variable) + cluster1 = data.cluster_limit(1, [2], False) + cluster2 = Cluster(data, "Limit", [2], AddVariable=False) + assert str(cluster1) == str(cluster2) -class TestSequencesn(_Cluster): +@pytest.fixture +def create_data_sequencen(): + return Sequences(str(get_shared_data("sequences2.seq"))) - def __init__(self): - _Cluster.__init__(self) - self.data = self.create_data() - def create_data(self): - data = Sequences(str(get_shared_data('sequences2.seq'))) - return data +def test_cluster_step_sequencen(create_data_sequencen): + data = create_data_sequencen + mode = True + cluster1 = data.cluster_step(1, 2, mode) + cluster2 = Cluster(data, "Step", 1, 2) + assert str(cluster1) == str(cluster2) - def test_cluster_step(self): - data = self.data - mode = True - cluster1 = data.cluster_step(1, 2, mode) - cluster2 = Cluster(data, "Step", 1, 2) - assert str(cluster1) == str(cluster2) - def test_cluster_limit(self): - data = self.data - cluster1 = data.cluster_limit(1, [2 ], True) - cluster2 = Cluster(data, "Limit", 1, [2]) - assert str(cluster1) == str(cluster2) - -if __name__ == "__main__": - runTestClass(TestVectors1()) - runTestClass(TestVectorsn()) - runTestClass(TestSequences1()) - runTestClass(TestSequencesn()) - runTestClass(TestConvolution()) - runTestClass(TestCompound()) - runTestClass(TestHistogram()) +def test_cluster_limit_sequencen(create_data_sequencen): + data = create_data_sequencen + cluster1 = data.cluster_limit(1, [2], True) + cluster2 = Cluster(data, "Limit", 1, [2]) + assert str(cluster1) == str(cluster2) diff --git a/test/test_compare.py b/test/test_compare.py index 6b29593..c7be12a 100644 --- a/test/test_compare.py +++ b/test/test_compare.py @@ -4,8 +4,11 @@ .. todo:: systematic tests """ + __revision__ = "$Id$" +import pytest + from openalea.sequence_analysis.sequences import Sequences from openalea.sequence_analysis.hidden_semi_markov import HiddenSemiMarkov from openalea.sequence_analysis.compare import Compare @@ -15,13 +18,15 @@ from openalea.sequence_analysis.estimate import Estimate from openalea.sequence_analysis.data_transform import Thresholding -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data -class _Compare(): + +class _Compare: """ a main class to test the Compare function on different type of data structure. """ + def __init__(self): self.data = None @@ -32,105 +37,105 @@ def test_compare(self): raise NotImplemented +@pytest.fixture +def create_data_compare_histogram(): + seq0 = Sequences(str(get_shared_data("chene_sessile_15pa.seq"))) + vec10 = Vectors(seq0) + vec95 = ValueSelect(vec10, 1, 95) + vec96 = ValueSelect(vec10, 1, 96) + vec97 = ValueSelect(vec10, 1, 97) + return [vec95, vec96, vec97] -class Test_Compare_Histograms(_Compare): - def __init__(self): - _Compare.__init__(self) - self.data = self.create_data() - def create_data(self): - seq0 = Sequences(str(get_shared_data( "chene_sessile_15pa.seq"))) - vec10 = Vectors(seq0) - vec95 = ValueSelect(vec10, 1, 95) - vec96 = ValueSelect(vec10, 1, 96) - vec97 = ValueSelect(vec10, 1, 97) - return([vec95, vec96, vec97]) +def test_compare_compare_histogram(create_data_compare_histogram): + seq = create_data_compare_histogram + res = Compare( + ExtractHistogram(seq[0], 2), + ExtractHistogram(seq[1], 2), + ExtractHistogram(seq[2], 2), + "N", + ) + assert res - def test_compare(self): - seq = self.data - res = Compare(ExtractHistogram(seq[0], 2), - ExtractHistogram(seq[1], 2), - ExtractHistogram(seq[2], 2), "N") - assert res +@pytest.fixture +def create_data_sequences(): + return Sequences(str(get_shared_data("dupreziana_a1.seq"))) -class Test_Compare_Sequences(_Compare): - def __init__(self): - _Compare.__init__(self) - self.data = self.create_data() +def test_compare_sequences(create_data_sequences): + seq = create_data_sequences + matrix20 = Compare(seq) + assert matrix20 - def create_data(self): - seq = Sequences(str(get_shared_data( 'dupreziana_a1.seq'))) - return(seq) - def test_compare(self): - seq = self.data - matrix20 = Compare(seq) - assert matrix20 +@pytest.fixture +def create_data_vectordistance(): + return Sequences(str(get_shared_data("dupreziana_a1.seq"))) -class Test_Compare_Sequences_VectorDistance(_Compare): +def test_compare_vectordistance(create_data_vectordistance): + seq = create_data_vectordistance + matrix20 = Compare(seq, VectorDistance("N", "N")) + assert matrix20 - def __init__(self): - _Compare.__init__(self) - self.data = self.create_data() - def create_data(self): - seq = Sequences(str(get_shared_data( 'dupreziana_a1.seq'))) - return(seq) +@pytest.fixture +def create_data_vectors_vectordistance(): + return Vectors([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) - def test_compare(self): - seq = self.data - matrix20 = Compare(seq, VectorDistance("N", "N")) - assert matrix20 +def test_compare_vectors_vectordistance(create_data_vectors_vectordistance): + data = create_data_vectors_vectordistance + a = Compare(data, VectorDistance("N", "N", "N")) + assert a.nb_row == 3 + assert a.nb_column == 3 -class Test_Compare_Vectors_VectorDistance(_Compare): - def __init__(self): - _Compare.__init__(self) - self.data = self.create_data() +@pytest.fixture +def create_data_compare_hsmc_with_sequences(): + hsmc0 = HiddenSemiMarkov(str(get_shared_data("belren1.hsc"))) + hsmc1 = HiddenSemiMarkov(str(get_shared_data("elstar1.hsc"))) + seq0 = Sequences(str(get_shared_data("belren1.seq"))) + seq1 = Sequences(str(get_shared_data("elstar1.seq"))) + data0 = Estimate(seq0, "HIDDEN_SEMI-MARKOV", hsmc0) + data1 = Estimate(seq1, "HIDDEN_SEMI-MARKOV", hsmc1) + return [seq0, seq1, data0, data1] - def create_data(self): - data = Vectors([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) - return(data) - - def test_compare(self): - data = self.data - a = Compare(data, VectorDistance("N", "N", "N")) - assert a.nb_row == 3 - assert a.nb_column == 3 - +def test_compare_compare_hsmc_with_sequences(create_data_compare_hsmc_with_sequences): + data = create_data_compare_hsmc_with_sequences + matrix20 = Compare( + Thresholding(data[2], MinProbability=0.001), + data[0], + Thresholding(data[3], MinProbability=0.001), + data[1], + 10000, + ) + assert matrix20 class Test_Compare_hsmc_with_sequences(_Compare): - def __init__(self): _Compare.__init__(self) self.data = self.create_data() def create_data(self): - hsmc0 = HiddenSemiMarkov(str(get_shared_data( "belren1.hsc"))) + hsmc0 = HiddenSemiMarkov(str(get_shared_data("belren1.hsc"))) hsmc1 = HiddenSemiMarkov(str(get_shared_data("elstar1.hsc"))) - seq0 = Sequences(str(get_shared_data( "belren1.seq"))) - seq1 = Sequences(str(get_shared_data( "elstar1.seq"))) + seq0 = Sequences(str(get_shared_data("belren1.seq"))) + seq1 = Sequences(str(get_shared_data("elstar1.seq"))) data0 = Estimate(seq0, "HIDDEN_SEMI-MARKOV", hsmc0) data1 = Estimate(seq1, "HIDDEN_SEMI-MARKOV", hsmc1) - return([seq0, seq1, data0, data1]) + return [seq0, seq1, data0, data1] def test_compare(self): data = self.data - matrix20 = Compare(Thresholding(data[2], MinProbability=0.001), data[0], - Thresholding(data[3], MinProbability=0.001), data[1], - 10000) + matrix20 = Compare( + Thresholding(data[2], MinProbability=0.001), + data[0], + Thresholding(data[3], MinProbability=0.001), + data[1], + 10000, + ) assert matrix20 - - -if __name__ == "__main__": - runTestClass(Test_Compare_Histograms()) - runTestClass(Test_Compare_Sequences()) - runTestClass(Test_Compare_Sequences_VectorDistance()) - runTestClass(Test_Compare_Vectors_VectorDistance()) - runTestClass(Test_Compare_hsmc_with_sequences()) diff --git a/test/test_compute_self_transition.py b/test/test_compute_self_transition.py index 9a28816..7be8406 100644 --- a/test/test_compute_self_transition.py +++ b/test/test_compute_self_transition.py @@ -2,12 +2,10 @@ .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ -__revision__ = "$Id$" from openalea.sequence_analysis.data_transform import ComputeSelfTransition -from openalea.sequence_analysis import Sequences -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import Sequences, get_shared_data seq1 = Sequences(str(get_shared_data("sequences1.seq"))) seqn = Sequences(str(get_shared_data("sequences2.seq"))) @@ -25,6 +23,3 @@ def test_ComputeSelfTransition_order(): the order arguments is protected...""" ComputeSelfTransition(seqn, Order=2) -if __name__ == "__main__": - test_ComputeSelfTransition() - test_ComputeSelfTransition_order() diff --git a/test/test_correlation.py b/test/test_correlation.py index 12c96a8..053e8a7 100644 --- a/test/test_correlation.py +++ b/test/test_correlation.py @@ -1,9 +1,10 @@ -""" Tests on ComputeAutoCorrelation, ComputeParialAutoCorrelation, +"""Tests on ComputeAutoCorrelation, ComputeParialAutoCorrelation, ComputewhiteNoiseCorrelation .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id$" @@ -15,45 +16,47 @@ from openalea.sequence_analysis.correlation import ComputePartialAutoCorrelation from openalea.stat_tool.distribution import Distribution -from tools import runTestClass -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass +from .tools import runTestClass, robust_path as get_shared_data -class Data(): +class Data: def __init__(self): - self.sequence = self.create_sequence_data() self.type_map = type_dict def create_sequence_data(self): - - seq66 = Sequences(str(get_shared_data( "laricio_date66.seq"))) - seq69 = MovingAverage(VariableScaling(seq66, 3, 100), - Distribution("B", 0, 6, 0.5), BeginEnd=True, - Output="Residual") + seq66 = Sequences(str(get_shared_data("laricio_date66.seq"))) + seq69 = MovingAverage( + VariableScaling(seq66, 3, 100), + Distribution("B", 0, 6, 0.5), + BeginEnd=True, + Output="Residual", + ) return seq69 + def CorrelationData(index=1): """Returns a correlation index from 1 to 3""" - seq66 = Sequences(str(get_shared_data( "laricio_date66.seq"))) + seq66 = Sequences(str(get_shared_data("laricio_date66.seq"))) ret = ComputeCorrelation(seq66, index) return ret - - class TestComputeCorrelation(Data): - def __init__(self): Data.__init__(self) self.variable = 2 - def compute_correlation_type(self, variable, type, MaxLag=10, - Normalization="Exact"): + + def compute_correlation_type( + self, variable, type, MaxLag=10, Normalization="Exact" + ): seq = self.sequence - cf = ComputeCorrelation(seq, variable, - Type=type, MaxLag=MaxLag, Normalization=Normalization) + cf = ComputeCorrelation( + seq, variable, Type=type, MaxLag=MaxLag, Normalization=Normalization + ) assert cf.type == self.type_map[type] return cf @@ -62,9 +65,9 @@ def test_correlation_no_optional_arguments(self): cf = ComputeCorrelation(seq, self.variable) def test_spearman(self): - seq = Sequences(str(get_shared_data( "laricio_date66.seq"))) + seq = Sequences(str(get_shared_data("laricio_date66.seq"))) ComputeCorrelation(seq, 1, Type="Spearman") - ComputeCorrelation(seq, 1, 2,Type="Spearman") + ComputeCorrelation(seq, 1, 2, Type="Spearman") try: dummy = 3 ComputeCorrelation(seq, 1, 2, dummy, Type="Spearman") @@ -89,9 +92,7 @@ def test_norm3(self): assert True - class TestComputeWhiteNoiseCorrelation(TestComputeCorrelation): - def __init__(self): TestComputeCorrelation.__init__(self) self.correlation = self.test_pearson() @@ -106,10 +107,10 @@ def test_order(self): def test_distribution(self): data = self.correlation - ComputeWhiteNoiseCorrelation(data , Distribution("BINOMIAL", 0,4,0.5)) + ComputeWhiteNoiseCorrelation(data, Distribution("BINOMIAL", 0, 4, 0.5)) -class TestComputePartialAutoCorrelation(Data): +class TestComputePartialAutoCorrelation(Data): def __init__(self): Data.__init__(self) diff --git a/test/test_cumulate.py b/test/test_cumulate.py index fe6ce8d..c86f18b 100644 --- a/test/test_cumulate.py +++ b/test/test_cumulate.py @@ -1,45 +1,36 @@ -""" Cumulate tests +"""Cumulate tests .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo : in general, variable index starts at 1 when calling Cumulate! -Do we want to start at 0 ? Since later on, python calls will +Do we want to start at 0 ? Since later on, python calls will start the index at 0 ? - + """ + __revision__ = "$Id$" from openalea.sequence_analysis.data_transform import Cumulate -from tools import runTestClass, robust_path as get_shared_data +from .tools import robust_path as get_shared_data from openalea.sequence_analysis import Sequences seqn = Sequences(str(get_shared_data("sequences2.seq"))) seq1 = Sequences(str(get_shared_data("sequences1.seq"))) - - - def test_cumulate1(): data = seq1 a = Cumulate(data) b = data.cumulate(1).markovian_sequences() - + assert str(a) == str(b) assert a.get_max_value(0) == 29 assert b.get_max_value(0) == 29 - + assert data.get_max_value(0) == 2 def test_cumulaten(): - for var in range(1, seqn.nb_variable+1): + for var in range(1, seqn.nb_variable + 1): assert str(seqn.cumulate(var).markovian_sequences()) == str(Cumulate(seqn, var)) - - -if __name__ == "__main__": - test_cumulate1() - test_cumulaten() - - diff --git a/test/test_data.py b/test/test_data.py index db4ec70..85a7020 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -1,10 +1,13 @@ -from tools import runTestClass, robust_path as get_shared_data +from .tools import robust_path as get_shared_data def test_get_shared_data(): from openalea.sequence_analysis.sequences import Sequences - seq = Sequences(str(get_shared_data('wij1.seq'))) - assert(seq) -if __name__ == "__main__": - test_get_shared_data() \ No newline at end of file + seq = Sequences(str(get_shared_data("wij1.seq"))) + assert seq + + +##if __name__ == "__main__": +## test_get_shared_data() + diff --git a/test/test_data_transform.py b/test/test_data_transform.py index a2463a0..5d3e736 100644 --- a/test/test_data_transform.py +++ b/test/test_data_transform.py @@ -3,91 +3,107 @@ .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ -__revision__ = "$Id$" - - -from openalea.sequence_analysis import get_shared_data -from openalea.sequence_analysis.data_transform import * -from openalea.sequence_analysis.sequences import Sequences -from openalea.stat_tool import Mixture -from openalea.stat_tool import Distribution -from openalea.stat_tool import Simulate -from openalea.stat_tool import Merge -from openalea.stat_tool import SelectStep -from openalea.stat_tool import Plot -from openalea.stat_tool import Display -from openalea.stat_tool import Vectors -from tools import runTestClass, robust_path as get_shared_data - -class TestRemoveRun(): - def __init__(self): - self.data = Sequences(str(get_shared_data("sequences1.seq"))) - - def _test_sequences_1(self): - - seq1 = self.data - seq2 = seq1.remove_run(1, 0,"e",2) - seq3 = RemoveRun(seq1,1, 0,"e", MaxLength=2) - assert str(seq3)==str(seq2) +__revision__ = "$Id$" - def test_incorrect_value(self): - seq1 = self.data +import pytest + +from openalea.sequence_analysis import ( + ComputeStateSequences, + RemoveRun, + Sequences, + TransitionCount, +) +from openalea.stat_tool import ( + Display, + Distribution, + Merge, + Mixture, + Plot, + SelectStep, + Simulate, + Vectors, +) +from .tools import robust_path as get_shared_data + + +@pytest.fixture +def create_data_sequence(): + return Sequences(str(get_shared_data("sequences1.seq"))) + + +@pytest.fixture +def create_data_sequence2(): + return Sequences(str(get_shared_data("sequences2.seq"))) + + +class TestRemoveRun: + def test_sequences_1(self, create_data_sequence): + seq1 = create_data_sequence + seq2 = seq1.remove_run(1, 0, "e", 2) + seq3 = RemoveRun(seq1, 1, 0, "e", MaxLength=2) + assert str(seq3) == str(seq2) + + def test_incorrect_value(self, create_data_sequence): + seq1 = create_data_sequence try: - seq1.remove_run(1,3,'e',10) + seq1.remove_run(1, 3, "e", 10) assert False except: assert True try: - seq1.remove_run(1,-1,'e',10) + seq1.remove_run(1, -1, "e", 10) assert False except: assert True - def test_incorrect_variable(self): - seq1 = self.data + def test_incorrect_variable(self, create_data_sequence): + seq1 = create_data_sequence try: - seq1.remove_run(0,2,'e',10) + seq1.remove_run(0, 2, "e", 10) assert False except: assert True - def _test_sequences_2(self): - seq1 = Sequences(str(get_shared_data("sequences2.seq"))) - seq2 = seq1.remove_run(1, 0,"e",2) - seq3 = RemoveRun(seq1,1, 0,"e",2) - assert str(seq3)==str(seq2) + def test_sequences_2(self, create_data_sequence2): + seq1 = create_data_sequence2 + seq2 = seq1.remove_run(1, 0, "e", 2) + seq3 = RemoveRun(seq1, 1, 0, "e", 2) + assert str(seq3) == str(seq2) def test_markov_data(): """not implemented""" pass + def test_semi_markov_data(): """not implemented""" pass + def test_discrete_sequences(): """not implemented""" pass + def test_compute_state_sequence(): from openalea.sequence_analysis import HiddenSemiMarkov - seq = Sequences(str(get_shared_data( "wij1.seq"))) - hsmc0 = HiddenSemiMarkov(str(get_shared_data( "wij1.hsc"))) + + seq = Sequences(str(get_shared_data("wij1.seq"))) + hsmc0 = HiddenSemiMarkov(str(get_shared_data("wij1.hsc"))) ComputeStateSequences(seq, hsmc0, Algorithm="ForwardBackward", Characteristics=True) def test_transition_count(): - seq = Sequences(str(get_shared_data( "wij1.seq"))) - TransitionCount(seq, 5, Begin=True, Estimator="MaximumLikelihood", - Filename = "ASCII") + seq = Sequences(str(get_shared_data("wij1.seq"))) + TransitionCount(seq, 5, Begin=True, Estimator="MaximumLikelihood", Filename="ASCII") def test_merge(): - - mixt1 = Mixture(0.6, Distribution("B", 2, 18, 0.5), - 0.4, Distribution("NB", 10, 10, 0.5)) + mixt1 = Mixture( + 0.6, Distribution("B", 2, 18, 0.5), 0.4, Distribution("NB", 10, 10, 0.5) + ) mixt_histo1 = Simulate(mixt1, 200) @@ -103,22 +119,22 @@ def test_select_step(): """ ######################################################################### # - # Well-log data; used in Fearnhead and Clifford "On-line Inference for + # Well-log data; used in Fearnhead and Clifford "On-line Inference for # Hidden Markov Models via Particle Filters". Measurements of Nuclear-response - # of a well-bore over time. Data from O Ruanaidh, J. J. K. and - # Fitzgerald, W. J. (1996). "Numerical Bayesion Methods Applied to Signal + # of a well-bore over time. Data from O Ruanaidh, J. J. K. and + # Fitzgerald, W. J. (1996). "Numerical Bayesion Methods Applied to Signal # Processing". New York: Springer. # ######################################################################### """ - seq1 = Sequences(str(get_shared_data( "well_log_filtered.seq"))) + seq1 = Sequences(str(get_shared_data("well_log_filtered.seq"))) Plot(seq1, ViewPoint="Data") Plot(seq1) SelectStep(seq1, 1000) Plot(seq1) - #Display(seq1, 1, 17, "Gaussian", ViewPoint="SegmentProfile", NbSegmentation=5) + # Display(seq1, 1, 17, "Gaussian", ViewPoint="SegmentProfile", NbSegmentation=5) Plot(seq1, 1, 17, "Gaussian", ViewPoint="SegmentProfile") # seq20 = Segmentation(seq1, 1, 20, "Gaussian") @@ -134,8 +150,3 @@ def test_select_step(): SelectStep(vec1, 1000) Plot(vec1) - -if __name__ == "__main__": - runTestClass(test_merge()) - runTestClass(TestRemoveRun()) - test_compute_state_sequence() diff --git a/test/test_dataflow_stat.py b/test/test_dataflow_stat.py index a9d5150..3b39584 100644 --- a/test/test_dataflow_stat.py +++ b/test/test_dataflow_stat.py @@ -1,52 +1,50 @@ -from openalea.core.alea import * -# !!important!! import dataflowview, which defines the fields of each nodes -#from openalea.grapheditor import dataflowview +try: + from openalea.core.alea import * + # !!important!! import dataflowview, which defines the fields of each nodes + #from openalea.grapheditor import dataflowview + core = True +except ImportError: + core = False + +if core: + pm = PackageManager() + pm.init(verbose=True) + + # These tests use gnuplot interface, which requires human interaction + # Consequently, they cannot be used within builbot (which hangs forever) + # We added a flags inside aml/src/aml/wralea/py_stat.py to prevent gnuplot + # to be launched if these tests are run with nosetests. The remaining of the + # nodes are run. + # In order to have the gnuplot interface, run this script with python instead of nosetests + + def test_demo_corsican(): + """ Test changepoint demo corsican """ + res = run(('demo.changepoint_stat_tool','Corsican pine change point'),{},pm=pm) + assert res == [] + + def test_demo_dycorinia(): + """ Test dataflow demo dycorinia """ + res = run(('demo.changepoint_stat_tool','Dycorinia change point'),{},pm=pm) + assert res == [] + + def test_oak_demo(): + """ Test dataflow demo oak""" + res = run(('demo.changepoint_stat_tool', 'oak_demo'),{},pm=pm) + assert res == [] + + def test_beech1_demo(): + """ Test dataflow demo beech""" + res = run(('demo.changepoint_stat_tool', 'beech1'),{},pm=pm) + assert res == [] + + def test_stat_tool_demos_and_tutorial_convolution(): + """ Test dataflow demo compound tutorial""" + res = run(('demo.stat_tool demos and tutorials', 'convolution_tutorial'),{},pm=pm) + assert res == [] + + + def test_stat_tool_demos_and_tutorial_compound(): + res = run(('demo.stat_tool demos and tutorials', 'compound_tutorial'),{},pm=pm) + assert res == [] -pm = PackageManager() -pm.init(verbose=True) - -# These tests use gnuplot interface, which requires human interaction -# Consequently, they cannot be used within builbot (which hangs forever) -# We added a flags inside aml/src/aml/wralea/py_stat.py to prevent gnuplot -# to be launched if these tests are run with nosetests. The remaining of the -# nodes are run. -# In order to have the gnuplot interface, run this script with python instead of nosetests - -def test_demo_corsican(): - """ Test changepoint demo corsican """ - res = run(('demo.changepoint_stat_tool','Corsican pine change point'),{},pm=pm) - assert res == [] - -def test_demo_dycorinia(): - """ Test dataflow demo dycorinia """ - res = run(('demo.changepoint_stat_tool','Dycorinia change point'),{},pm=pm) - assert res == [] - -def test_oak_demo(): - """ Test dataflow demo oak""" - res = run(('demo.changepoint_stat_tool', 'oak_demo'),{},pm=pm) - assert res == [] - -def test_beech1_demo(): - """ Test dataflow demo beech""" - res = run(('demo.changepoint_stat_tool', 'beech1'),{},pm=pm) - assert res == [] - -def test_stat_tool_demos_and_tutorial_convolution(): - """ Test dataflow demo compound tutorial""" - res = run(('demo.stat_tool demos and tutorials', 'convolution_tutorial'),{},pm=pm) - assert res == [] - - -def test_stat_tool_demos_and_tutorial_compound(): - res = run(('demo.stat_tool demos and tutorials', 'compound_tutorial'),{},pm=pm) - assert res == [] - - - -if __name__ == "__main__": - test_demo_corsican() - test_demo_dycorinia() - test_stat_tool_tutorial_compound() - test_stat_tool_tutorial_convolution() diff --git a/test/test_difference.py b/test/test_difference.py index d251a7b..52358ba 100644 --- a/test/test_difference.py +++ b/test/test_difference.py @@ -1,43 +1,48 @@ -""" Difference tests +"""Difference tests .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr - + """ + __revision__ = "$Id$" +import pytest from openalea.sequence_analysis.data_transform import Difference from openalea.sequence_analysis import Sequences -from tools import runTestClass, robust_path as get_shared_data +from .tools import robust_path as get_shared_data + + +@pytest.fixture +def build_seq1(): + return Sequences(str(get_shared_data("sequences1.seq"))) -seq1 = Sequences(str(get_shared_data("sequences1.seq"))) -seqn = Sequences(str(get_shared_data("sequences2.seq"))) +@pytest.fixture +def build_seqn(): + return Sequences(str(get_shared_data("sequences2.seq"))) -def test_difference1(): + +def test_difference1(build_seq1): """difference test to finalise""" - data = seq1 - res = Difference(data,1) - assert str(res)==str(data.difference(1, False)) + data = build_seq1 + res = Difference(data, 1) + assert str(res) == str(data.difference(1, False)) assert res.cumul_length == 50 -def test_difference1_first_element(): + +def test_difference1_first_element(build_seq1): """difference test to finalise""" - data = seq1 - res = Difference(data,1, True) - assert str(res)==str(data.difference(1, True)) + data = build_seq1 + res = Difference(data, 1, True) + assert str(res) == str(data.difference(1, True)) assert res.cumul_length == 52 -def test_differencen(): + +def test_differencen(build_seqn): """difference test to finalise""" - data = seqn - res = Difference(data,Variable=1) - assert str(res)==str(data.difference(1, False)) + data = build_seqn + res = Difference(data, Variable=1) + assert str(res) == str(data.difference(1, False)) assert res.cumul_length == 23 - -if __name__ == "__main__": - test_difference1() - test_difference1_first_element() - test_differencen() - diff --git a/test/test_estimate.py b/test/test_estimate.py index f699973..2708586 100644 --- a/test/test_estimate.py +++ b/test/test_estimate.py @@ -4,161 +4,226 @@ .. todo:: finalise """ + __revision__ = "$Id$" +import pytest + from openalea.stat_tool.vectors import Vectors from openalea.stat_tool.data_transform import ExtractHistogram -from tools import runTestClass -from test_tops import TopsData -from test_hidden_semi_markov import HiddenSemiMarkovData -from test_semi_markov import SemiMarkovData +from .test_tops import TopsData +from .test_hidden_semi_markov import HiddenSemiMarkovData -from openalea.sequence_analysis import * +from openalea.sequence_analysis import ( + Sequences, + Merge, + RemoveRun, + SegmentationExtract, + LengthSelect, + Estimate, +) -from tools import runTestClass, robust_path as get_shared_data +from .tools import robust_path as get_shared_data -_seq1 = Sequences(str(get_shared_data('dupreziana_20a2.seq'))) +_seq1 = Sequences(str(get_shared_data("dupreziana_20a2.seq"))) seq2 = RemoveRun(_seq1, 1, 0, "End") -seq3 = Sequences(str(get_shared_data('dupreziana_40a2.seq'))) +seq3 = Sequences(str(get_shared_data("dupreziana_40a2.seq"))) seq4_0 = RemoveRun(seq3, 2, 0, "End") seq4 = SegmentationExtract(seq4_0, 1, 2) -seq5 = Sequences(str(get_shared_data('dupreziana_60a2.seq'))) +seq5 = Sequences(str(get_shared_data("dupreziana_60a2.seq"))) seq6_0 = RemoveRun(seq5, 2, 0, "End") seq6 = LengthSelect(SegmentationExtract(seq6_0, 1, 2), 1, Mode="Reject") -seq7 = Sequences(str(get_shared_data('dupreziana_80a2.seq'))) +seq7 = Sequences(str(get_shared_data("dupreziana_80a2.seq"))) seq8_0 = RemoveRun(seq7, 2, 0, "End") seq8 = SegmentationExtract(seq8_0, 1, 2) seq10 = Merge(seq2, seq4, seq6, seq8) - - -class Test_Estimate_Histogram(): - def __init__(self): - self.data = self.create_data() - - def create_data(self): - seq0 = Sequences(str(get_shared_data( "chene_sessile_15pa.seq"))) - vec10 = Vectors(seq0) - return vec10 - - def test_estimate_mixture(self): - mixt20 = Estimate(ExtractHistogram(self.data, 2), - "MIXTURE", "NB", "NB", "NB", "NB", - NbComponent="Estimated") - assert mixt20.nb_component == 2 - - def test_estimate_mixture2(self): - mixt20 = Estimate(ExtractHistogram(self.data, 5), - "MIXTURE", "NB", "NB", "NB", "NB", - NbComponent="Estimated") - assert mixt20.nb_component == 3 - -class Test_Estimate_VARIABLE_ORDER_MARKOV(): - - def __init__(self): - self.sequence = seq10 - self.type = "VARIABLE_ORDER_MARKOV" - - def test_estimate(self): - mc10 = Estimate(self.sequence, self.type, "Ordinary", - MaxOrder=5, GlobalInitialTransition=True) - - def test_estimate1(self): - mc11 = Estimate(self.sequence , self.type, "Ordinary", - MaxOrder=5, GlobalInitialTransition=False) - - def test_estimate2(self): - mc12 = Estimate(self.sequence, self.type, "Ordinary", - Algorithm="LocalBIC", Threshold=10., - MaxOrder=5, GlobalInitialTransition=False, - GlobalSample=False) - - def test_estimate3(self): - mc13 = Estimate(self.sequence, self.type, "Ordinary", - Algorithm="Context", Threshold=1., - MaxOrder=5, GlobalInitialTransition=False, - GlobalSample=False) - def test_estimate4(self): - for Algorithm in ["CTM_BIC", "CTM_KT", "Context"]: - mc13 = Estimate(self.sequence, self.type, "Ordinary", - Algorithm=Algorithm, - MaxOrder=5, GlobalInitialTransition=False, - GlobalSample=False) - def test_estimate_error1(self): - """test that Estimator and Algorith=CTM_KT are incompatible""" - try: - mc13 = Estimate(self.sequence, self.type, "Ordinary", - Algorithm="CTM_KT", Estimator="Laplace", - MaxOrder=5, GlobalInitialTransition=False, - GlobalSample=False) - assert False - except: - assert True - - -class Test_Estimate_VARIABLE_ORDER_MARKOV_from_markovian(): - def test_estimate(self): - mc11 = Estimate(seq10 , "VARIABLE_ORDER_MARKOV", "Ordinary", - MaxOrder=5, GlobalInitialTransition=False) - mc2 = Estimate(seq2, "VARIABLE_ORDER_MARKOV", - mc11, GlobalInitialTransition=False) - -class Test_Estimate_HIDDEN_VARIABLE_ORDER_MARKOV(): - def test_estimate(self): - seq1 = Sequences(str(get_shared_data('sequences1.seq'))) - hvom_sample = HiddenVariableOrderMarkov(str(get_shared_data("dupreziana21.hc"))) - hmc_estimated = Estimate(seq1, "HIDDEN_VARIABLE_ORDER_MARKOV", hvom_sample, - GlobalInitialTransition=True, NbIteration=80) - assert hmc_estimated - -class Test_Estimate_HIDDEN_SEMI_MARKOV(): - - def __init__(self): - self.data = HiddenSemiMarkovData() - self.sequence = Sequences(str(get_shared_data( "wij1.seq"))) - - - def test_estimate(self): - seq = self.sequence - # data is a hsm class - Estimate(seq, "HIDDEN_SEMI-MARKOV", self.data) - - -class Test_Estimate_SEMI_MARKOV(): - - def __init__(self): - #self.data = SemiMarkovData() - self.sequence = Sequences(str(get_shared_data( "wij1.seq"))) - - def _test_estimate(self): - seq = self.sequence - # data is a hsm class - Estimate(seq, "SEMI-MARKOV", "Ordinary") - - -class Test_Estimate_time_events(): +@pytest.fixture +def create_data_estimate_histogram(): + seq0 = Sequences(str(get_shared_data("chene_sessile_15pa.seq"))) + return Vectors(seq0) + + +def test_estimate_mixture(create_data_estimate_histogram): + mixt20 = Estimate( + ExtractHistogram(create_data_estimate_histogram, 2), + "MIXTURE", + "NB", + "NB", + "NB", + "NB", + NbComponent="Estimated", + ) + assert mixt20.nb_component == 2 + + +def test_estimate_mixture2(create_data_estimate_histogram): + mixt20 = Estimate( + ExtractHistogram(create_data_estimate_histogram, 5), + "MIXTURE", + "NB", + "NB", + "NB", + "NB", + NbComponent="Estimated", + ) + assert mixt20.nb_component == 3 + + +sequence = seq10 +estimate_type = "VARIABLE_ORDER_MARKOV" + + +def test_estimate(): + mc10 = Estimate( + sequence, + estimate_type, + "Ordinary", + MaxOrder=5, + GlobalInitialTransition=True, + ) + + +def test_estimate1(): + mc11 = Estimate( + sequence, + estimate_type, + "Ordinary", + MaxOrder=5, + GlobalInitialTransition=False, + ) + + +def test_estimate2(): + mc12 = Estimate( + sequence, + estimate_type, + "Ordinary", + Algorithm="LocalBIC", + Threshold=10.0, + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, + ) + + +def test_estimate3(): + mc13 = Estimate( + sequence, + estimate_type, + "Ordinary", + Algorithm="Context", + Threshold=1.0, + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, + ) + + +def test_estimate4(): + for Algorithm in ["CTM_BIC", "CTM_KT", "Context"]: + mc13 = Estimate( + sequence, + estimate_type, + "Ordinary", + Algorithm=Algorithm, + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, + ) + + +def test_estimate_error1(): + """test that Estimator and Algorith=CTM_KT are incompatible""" + try: + mc13 = Estimate( + sequence, + estimate_type, + "Ordinary", + Algorithm="CTM_KT", + Estimator="Laplace", + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, + ) + assert False + except: + assert True + + +def Test_Estimate_VARIABLE_ORDER_MARKOV_from_markovian(): + mc11 = Estimate( + seq10, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + MaxOrder=5, + GlobalInitialTransition=False, + ) + mc2 = Estimate(seq2, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) + + +@pytest.fixture +def create_sequence_estimate_variable_order_markov(): + return Sequences(str(get_shared_data("sequences1.seq"))) + + +@pytest.fixture +def create_hvom_estimate_hidden_variable_order_markov(): + return HiddenVariableOrderMarkov(str(get_shared_data("dupreziana21.hc"))) + + +def test_estimate_hidden_variable_order_markov( + create_sequence_estimate_variable_order_markov, + create_hvom_estimate_hidden_variable_order_markov, +): + hmc_estimated = Estimate( + create_sequence_estimate_variable_order_markov, + "HIDDEN_VARIABLE_ORDER_MARKOV", + create_hvom_estimate_hidden_variable_order_markov, + GlobalInitialTransition=True, + NbIteration=80, + ) + assert hmc_estimated + + +@pytest.fixture +def create_data_estimate_hidden_semi_markov(): + return HiddenSemiMarkovData() + + +@pytest.fixture +def create_sequence_estimate_hidden_semi_markov(): + return Sequences(str(get_shared_data("wij1.seq"))) + + +def test_estimate_hidden_semi_markov( + create_data_estimate_hidden_semi_markov, create_sequence_estimate_hidden_semi_markov +): + # data is a hsm class + Estimate( + create_sequence_estimate_hidden_semi_markov, + "HIDDEN_SEMI-MARKOV", + create_data_estimate_hidden_semi_markov, + ) + + +def test_estimate_semi_markov(): + sequence = Sequences(str(get_shared_data("wij1.seq"))) + Estimate(sequence, "SEMI-MARKOV", "Ordinary") + + +def test_estimate_time_events(): """test not yet implemented""" pass -class Test_Estimate_tops(): - """tests not yet implemented""" - - def __init__(self): - self.data = TopsData() - - def test_estimate(self): - Estimate(self.data, MinPosition=1, MaxPosition=10) +@pytest.fixture +def create_data_estimate_tops(): + return TopsData() -if __name__ == "__main__": - runTestClass(Test_Estimate_HIDDEN_VARIABLE_ORDER_MARKOV()) - runTestClass(Test_Estimate_VARIABLE_ORDER_MARKOV_from_markovian()) - runTestClass(Test_Estimate_VARIABLE_ORDER_MARKOV()) - runTestClass(Test_Estimate_Histogram()) - runTestClass(Test_Estimate_tops()) - runTestClass(Test_Estimate_HIDDEN_SEMI_MARKOV()) - runTestClass(Test_Estimate_SEMI_MARKOV()) +def test_estimate_tops(create_data_estimate_tops): + Estimate(create_data_estimate_tops, MinPosition=1, MaxPosition=10) diff --git a/test/test_exploratory.py b/test/test_exploratory.py index 5e482f9..1f91190 100644 --- a/test/test_exploratory.py +++ b/test/test_exploratory.py @@ -14,63 +14,101 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from openalea.sequence_analysis.estimate import Estimate -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import ( + Compare, + ContingencyTable, + Cluster, + Display, + ExtractHistogram, + Plot, + Regression, + SelectIndividual, + SelectVariable, + Sequences, + ValueSelect, + VarianceAnalysis, + Vectors, + VectorDistance, +) +from .tools import robust_path as get_shared_data + def test1(): - seq0 = Sequences(str(get_shared_data("chene_sessile_15pa.seq"))) Plot(seq0, ViewPoint="Data") - + # change of unit for the variable diameter of the annual shoot - + marginal3 = ExtractHistogram(seq0, "Value", 3) Plot(Cluster(marginal3, "Information", 0.75)) Plot(Cluster(marginal3, "Information", 0.61)) Plot(Cluster(marginal3, "Step", 10)) - + vec10 = Vectors(seq0) - + # plot of the average sequence - #BUG : TODO - #Plot(Regression(vec10, "MovingAverage", 1, 2, [1])) - + # BUG : TODO + # Plot(Regression(vec10, "MovingAverage", 1, 2, [1])) + vec95 = ValueSelect(vec10, 1, 95) vec96 = ValueSelect(vec10, 1, 96) vec97 = ValueSelect(vec10, 1, 97) - + VarianceAnalysis(vec10, 1, 2, "N") - - + print(type(ExtractHistogram(vec95, 2))) - - #BUG : TODO - #Compare(ExtractHistogram(vec95, 2), ExtractHistogram(vec96, 2), ExtractHistogram(vec97, 2), "N") - Plot(ExtractHistogram(vec95, 2), ExtractHistogram(vec96, 2), ExtractHistogram(vec97, 2)) - + + # BUG : TODO + # Compare(ExtractHistogram(vec95, 2), ExtractHistogram(vec96, 2), ExtractHistogram(vec97, 2), "N") + Plot( + ExtractHistogram(vec95, 2), + ExtractHistogram(vec96, 2), + ExtractHistogram(vec97, 2), + ) + ContingencyTable(vec10, 1, 4) - + # one-way variance analysis based on ranks - + VarianceAnalysis(vec10, 1, 4, "O") - #BUG : TODO - #Compare(ExtractHistogram(vec95, 4), ExtractHistogram(vec96, 4), ExtractHistogram(vec97, 4), "O") - Plot(ExtractHistogram(vec95, 4), ExtractHistogram(vec96, 4), ExtractHistogram(vec97, 4)) - - Plot(ExtractHistogram(vec95, 5), ExtractHistogram(vec96, 5), ExtractHistogram(vec97, 5)) - Plot(ExtractHistogram(vec95, 6), ExtractHistogram(vec96, 6), ExtractHistogram(vec97, 6)) - + # BUG : TODO + # Compare(ExtractHistogram(vec95, 4), ExtractHistogram(vec96, 4), ExtractHistogram(vec97, 4), "O") + Plot( + ExtractHistogram(vec95, 4), + ExtractHistogram(vec96, 4), + ExtractHistogram(vec97, 4), + ) + + Plot( + ExtractHistogram(vec95, 5), + ExtractHistogram(vec96, 5), + ExtractHistogram(vec97, 5), + ) + Plot( + ExtractHistogram(vec95, 6), + ExtractHistogram(vec96, 6), + ExtractHistogram(vec97, 6), + ) + vec11 = ValueSelect(vec10, 4, 1) vec12 = ValueSelect(vec10, 4, 2) vec13 = ValueSelect(vec10, 4, 3, 4) - - Plot(ExtractHistogram(vec11, 2), ExtractHistogram(vec12, 2), ExtractHistogram(vec13, 2)) - Plot(ExtractHistogram(vec11, 5), ExtractHistogram(vec12, 5), ExtractHistogram(vec13, 5)) - - #BUG : TODO + + Plot( + ExtractHistogram(vec11, 2), + ExtractHistogram(vec12, 2), + ExtractHistogram(vec13, 2), + ) + Plot( + ExtractHistogram(vec11, 5), + ExtractHistogram(vec12, 5), + ExtractHistogram(vec13, 5), + ) + + # BUG : TODO """mixt20 = Estimate(ExtractHistogram(vec10, 2), "MIXTURE", "NB", "NB", "NB", "NB", NbComponent="Estimated") Display(mixt20) Plot(mixt20) @@ -79,40 +117,187 @@ def test1(): mixt21 = Estimate(ExtractHistogram(vec10, 5), "MIXTURE", "NB", "NB", "NB", "NB", NbComponent="Estimated") """ vec9596 = ValueSelect(vec10, 1, 95, 96) - Plot(ExtractHistogram(ValueSelect(vec9596, 4, 1), 6), ExtractHistogram(ValueSelect(vec9596, 4, 2), 6), ExtractHistogram(ValueSelect(vec9596, 4, 3, 4), 6)) - + Plot( + ExtractHistogram(ValueSelect(vec9596, 4, 1), 6), + ExtractHistogram(ValueSelect(vec9596, 4, 2), 6), + ExtractHistogram(ValueSelect(vec9596, 4, 3, 4), 6), + ) + regress10 = Regression(vec10, "Linear", 5, 2) Display(regress10) Plot(regress10) - + # nonparametric regression (loess smoother) - - regress11 = Regression(vec10, "NearestNeighbours", 5, 2, 0.3) - + + regress11 = Regression(vec10, "NearestNeighbours", 5, 2, 0.3) + regress12 = Regression(vec9596, "Linear", 5, 6) regress13 = Regression(vec9596, "NearestNeighbours", 5, 6, 0.5) - + vec15 = SelectVariable(vec10, [1, 3, 6], Mode="Reject") - + # computation of a distance matrix using a standardization procedure - - #BUG : TODO - #matrix10 = Compare(vec15, VectorDistance("N", "N", "N")) - + + # BUG : TODO + # matrix10 = Compare(vec15, VectorDistance("N", "N", "N")) + # clustering using a partitioning method - - #BUG : TODO - #Display(Clustering(matrix10, "Partition", 2)) - - vec151 = SelectIndividual(vec10, [69, 48, 41, 44, 32, 47, 81, 95, 11, 36, 75, 108, 56, 83, 38, 98, 113, 134, 110, 101, 77, 35, 74, 80, 50, 24, 89, 128, 5, 45, 8, 116, 119, 132, 61, 78, 53, 29, 131, 65, 90, 96, 104, 20, 86, 66, 42, 68, 125, 14, 23, 54, 33, 26, 71, 129, 102, 51, 70, 111, 138, 19, 127, 62, 117, 137, 2, 28, 17]) - vec152 = SelectIndividual(vec10, [100, 13, 133, 105, 72, 9, 93, 109, 30, 115, 63, 7, 55, 37, 15, 114, 106, 46, 73, 18, 3, 87, 58, 43, 60, 76, 52, 6, 39, 31, 12, 99, 121, 123, 22, 79, 94, 88, 21, 97, 25, 40, 57, 136, 67, 49, 10, 4, 120, 92, 27, 91, 64, 124, 16, 130, 84, 107, 126, 103, 122, 112, 59, 1, 82, 34, 135, 118, 85]) + + # BUG : TODO + # Display(Clustering(matrix10, "Partition", 2)) + + vec151 = SelectIndividual( + vec10, + [ + 69, + 48, + 41, + 44, + 32, + 47, + 81, + 95, + 11, + 36, + 75, + 108, + 56, + 83, + 38, + 98, + 113, + 134, + 110, + 101, + 77, + 35, + 74, + 80, + 50, + 24, + 89, + 128, + 5, + 45, + 8, + 116, + 119, + 132, + 61, + 78, + 53, + 29, + 131, + 65, + 90, + 96, + 104, + 20, + 86, + 66, + 42, + 68, + 125, + 14, + 23, + 54, + 33, + 26, + 71, + 129, + 102, + 51, + 70, + 111, + 138, + 19, + 127, + 62, + 117, + 137, + 2, + 28, + 17, + ], + ) + vec152 = SelectIndividual( + vec10, + [ + 100, + 13, + 133, + 105, + 72, + 9, + 93, + 109, + 30, + 115, + 63, + 7, + 55, + 37, + 15, + 114, + 106, + 46, + 73, + 18, + 3, + 87, + 58, + 43, + 60, + 76, + 52, + 6, + 39, + 31, + 12, + 99, + 121, + 123, + 22, + 79, + 94, + 88, + 21, + 97, + 25, + 40, + 57, + 136, + 67, + 49, + 10, + 4, + 120, + 92, + 27, + 91, + 64, + 124, + 16, + 130, + 84, + 107, + 126, + 103, + 122, + 112, + 59, + 1, + 82, + 34, + 135, + 118, + 85, + ], + ) Plot(ExtractHistogram(vec151, 4), ExtractHistogram(vec152, 4)) - + matrix11 = Compare(vec15, VectorDistance("N", "O", "N")) - + vec16 = SelectVariable(vec9596, [1, 3], Mode="Reject") matrix12 = Compare(vec16, VectorDistance("N", "N", "N", "N")) matrix13 = Compare(vec16, VectorDistance("N", "O", "N", "N")) - -if __name__ == "__main__": - test1() diff --git a/test/test_exploratory2.py b/test/test_exploratory2.py index d3c1e34..60f48da 100644 --- a/test/test_exploratory2.py +++ b/test/test_exploratory2.py @@ -21,47 +21,63 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * +from openalea.sequence_analysis import ( + ComputeCorrelation, + Display, + ExtractHistogram, + Merge, + Plot, + RemoveRun, + SegmentationExtract, + Sequences, + Transcode, +) from openalea.sequence_analysis.estimate import Estimate as Estimate -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data + def test_exploratory(): - seq19 = Sequences(str(get_shared_data( "dupreziana_20a2.seq"))) + seq19 = Sequences(str(get_shared_data("dupreziana_20a2.seq"))) seq20 = RemoveRun(seq19, 0, "End") histo201 = ExtractHistogram(seq20, "Recurrence", 1) histo202 = ExtractHistogram(seq20, "Recurrence", 2) - seq38 = Sequences(str(get_shared_data( "dupreziana_40a2.seq"))) + seq38 = Sequences(str(get_shared_data("dupreziana_40a2.seq"))) seq39 = RemoveRun(seq38, 2, 0, "End") seq40 = SegmentationExtract(seq39, 1, 2) histo401 = ExtractHistogram(seq40, "Recurrence", 1) histo402 = ExtractHistogram(seq40, "Recurrence", 2) - seq58 = Sequences(str(get_shared_data( "dupreziana_60a2.seq"))) + seq58 = Sequences(str(get_shared_data("dupreziana_60a2.seq"))) seq59 = RemoveRun(seq58, 2, 0, "End") - seq60 = LengthSelect(SegmentationExtract(seq59, 1, 2), 1, Mode="Reject") + seq60 = LengthSelect(SegmentationExtract(seq59, 1, 2), 1, Mode="Reject") histo601 = ExtractHistogram(seq60, "Recurrence", 1) histo602 = ExtractHistogram(seq60, "Recurrence", 2) - seq78 = Sequences(str(get_shared_data( "dupreziana_80a2.seq"))) + seq78 = Sequences(str(get_shared_data("dupreziana_80a2.seq"))) seq79 = RemoveRun(seq78, 2, 0, "End") seq80 = SegmentationExtract(seq79, 1, 2) histo801 = ExtractHistogram(seq80, "Recurrence", 1) histo802 = ExtractHistogram(seq80, "Recurrence", 2) - Plot(histo201, histo401, histo601, histo801) Plot(histo202, histo402, histo602, histo802) - Plot(ExtractHistogram(seq20, "Length"), ExtractHistogram(seq40, "Length"), ExtractHistogram(seq60, "Length"), ExtractHistogram(seq80, "Length")) - + Plot( + ExtractHistogram(seq20, "Length"), + ExtractHistogram(seq40, "Length"), + ExtractHistogram(seq60, "Length"), + ExtractHistogram(seq80, "Length"), + ) + seq10 = Merge(seq20, seq40, seq60, seq80) Display(seq10, ViewPoint="Data") - #Plot(seq10, "Intensity") - #Plot(seq10, "Recurrence") - #Plot(seq10, "Sojourn") + # Plot(seq10, "Intensity") + # Plot(seq10, "Recurrence") + # Plot(seq10, "Sojourn") # plot of a sample Spearman (rank based) autocorrelation function @@ -69,22 +85,27 @@ def test_exploratory(): seq11 = Transcode(seq10, [0, 1, 0]) seq12 = Transcode(seq10, [0, 0, 1]) - acf1 = Merge(ComputeCorrelation(seq11, MaxLag=15, Normalization="Exact"),\ - ComputeCorrelation(seq12, MaxLag=15, Normalization="Exact")) + acf1 = Merge( + ComputeCorrelation(seq11, MaxLag=15, Normalization="Exact"), + ComputeCorrelation(seq12, MaxLag=15, Normalization="Exact"), + ) Plot(acf1) Display(acf1) - acf2 = Merge(ComputeCorrelation(seq11, Type="Spearman", MaxLag=15, Normalization="Exact"),\ - ComputeCorrelation(seq12, Type="Spearman", MaxLag=15, Normalization="Exact")) - acf3 = Merge(ComputeCorrelation(seq11, Type="Kendall", MaxLag=15),\ - ComputeCorrelation(seq12, Type="Kendall", MaxLag=15)) + acf2 = Merge( + ComputeCorrelation(seq11, Type="Spearman", MaxLag=15, Normalization="Exact"), + ComputeCorrelation(seq12, Type="Spearman", MaxLag=15, Normalization="Exact"), + ) + acf3 = Merge( + ComputeCorrelation(seq11, Type="Kendall", MaxLag=15), + ComputeCorrelation(seq12, Type="Kendall", MaxLag=15), + ) + # model selection approach: estimation of both the parameters (initial probabilities and # transition probabilities) and the order (memory length) of a Markov chain -#todo -#mc10 = Estimate(seq10, "MARKOV", MaxOrder=4) -#Plot(mc10, "Intensity") -#Plot(mc10, "Recurrence") -if __name__ == "__main__": - test_exploratory() +# todo +# mc10 = Estimate(seq10, "MARKOV", MaxOrder=4) +# Plot(mc10, "Intensity") +# Plot(mc10, "Recurrence") diff --git a/test/test_exploratory3.py b/test/test_exploratory3.py index 41dcbb5..5d95688 100644 --- a/test/test_exploratory3.py +++ b/test/test_exploratory3.py @@ -21,69 +21,88 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import ( + ComputeCorrelation, + Display, + ExtractHistogram, + Merge, + Plot, + RemoveRun, + SegmentationExtract, + Sequences, + Transcode, +) +from .tools import runTestClass, robust_path as get_shared_data + def test1(): seq19 = Sequences(str(get_shared_data("dupreziana_20a2.seq"))) seq20 = RemoveRun(seq19, 0, "End") histo201 = ExtractHistogram(seq20, "Recurrence", 1) histo202 = ExtractHistogram(seq20, "Recurrence", 2) - + seq38 = Sequences(str(get_shared_data("dupreziana_40a2.seq"))) seq39 = RemoveRun(seq38, 2, 0, "End") seq40 = SegmentationExtract(seq39, 1, 2) histo401 = ExtractHistogram(seq40, "Recurrence", 1) histo402 = ExtractHistogram(seq40, "Recurrence", 2) - + seq58 = Sequences(str(get_shared_data("dupreziana_60a2.seq"))) seq59 = RemoveRun(seq58, 2, 0, "End") - seq60 = LengthSelect(SegmentationExtract(seq59, 1, 2), 1, Mode="Reject") + seq60 = LengthSelect(SegmentationExtract(seq59, 1, 2), 1, Mode="Reject") histo601 = ExtractHistogram(seq60, "Recurrence", 1) histo602 = ExtractHistogram(seq60, "Recurrence", 2) - + seq78 = Sequences(str(get_shared_data("dupreziana_80a2.seq"))) seq79 = RemoveRun(seq78, 2, 0, "End") seq80 = SegmentationExtract(seq79, 1, 2) histo801 = ExtractHistogram(seq80, "Recurrence", 1) histo802 = ExtractHistogram(seq80, "Recurrence", 2) - + Plot(histo201, histo401, histo601, histo801) Plot(histo202, histo402, histo602, histo802) - Plot(ExtractHistogram(seq20, "Length"), ExtractHistogram(seq40, "Length"), ExtractHistogram(seq60, "Length"), ExtractHistogram(seq80, "Length")) - + Plot( + ExtractHistogram(seq20, "Length"), + ExtractHistogram(seq40, "Length"), + ExtractHistogram(seq60, "Length"), + ExtractHistogram(seq80, "Length"), + ) + seq10 = Merge(seq20, seq40, seq60, seq80) Display(seq10, ViewPoint="Data") Plot(seq10, "Intensity") Plot(seq10, "Recurrence") Plot(seq10, "Sojourn") - + # plot of a sample Spearman (rank based) autocorrelation function - + Plot(ComputeCorrelation(seq10, Type="Spearman", MaxLag=15, Normalization="Exact")) - + seq11 = Transcode(seq10, [0, 1, 0]) seq12 = Transcode(seq10, [0, 0, 1]) - acf1 = Merge(ComputeCorrelation(seq11, MaxLag=15, Normalization="Exact"),\ - ComputeCorrelation(seq12, MaxLag=15, Normalization="Exact")) + acf1 = Merge( + ComputeCorrelation(seq11, MaxLag=15, Normalization="Exact"), + ComputeCorrelation(seq12, MaxLag=15, Normalization="Exact"), + ) Plot(acf1) Display(acf1) - - acf2 = Merge(ComputeCorrelation(seq11, Type="Spearman", MaxLag=15, Normalization="Exact"),\ - ComputeCorrelation(seq12, Type="Spearman", MaxLag=15, Normalization="Exact")) - acf3 = Merge(ComputeCorrelation(seq11, Type="Kendall", MaxLag=15),\ - ComputeCorrelation(seq12, Type="Kendall", MaxLag=15)) - + + acf2 = Merge( + ComputeCorrelation(seq11, Type="Spearman", MaxLag=15, Normalization="Exact"), + ComputeCorrelation(seq12, Type="Spearman", MaxLag=15, Normalization="Exact"), + ) + acf3 = Merge( + ComputeCorrelation(seq11, Type="Kendall", MaxLag=15), + ComputeCorrelation(seq12, Type="Kendall", MaxLag=15), + ) + # model selection approach: estimation of both the parameters (initial probabilities and # transition probabilities) and the order (memory length) of a Markov chain - - #todo - #mc10 = Estimate(seq10, MARKOV, MaxOrder=4) - + + # todo + # mc10 = Estimate(seq10, MARKOV, MaxOrder=4) + # Plot(mc10, "Intensity") # Plot(mc10, "Recurrence") - -if __name__ == "__main__": - test1() - diff --git a/test/test_exploratory4.py b/test/test_exploratory4.py index 474c0ce..bec7c5e 100644 --- a/test/test_exploratory4.py +++ b/test/test_exploratory4.py @@ -17,63 +17,109 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from openalea.sequence_analysis.compare import Compare as Compare -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import ( + Clustering, + Compare, + Display, + ExtractHistogram, + ExtractVectors, + MergeVariable, + Plot, + SegmentationExtract, + Sequences, + Shift, + VectorDistance, +) +from .tools import robust_path as get_shared_data + def test1(): + seq1 = Sequences(str(get_shared_data("dupreziana_a1.seq"))) - seq1 = Sequences(str(get_shared_data( "dupreziana_a1.seq"))) - Display(seq1, ViewPoint="Data", Format="Line") - - vec20 = MergeVariable(ExtractVectors(seq1, "NbOccurrence", 1, 3), ExtractVectors(seq1, "Length")) + + vec20 = MergeVariable( + ExtractVectors(seq1, "NbOccurrence", 1, 3), ExtractVectors(seq1, "Length") + ) Display(vec20) - #todo - #Plot(vec20,1) + # todo + # Plot(vec20,1) Plot(vec20) - + seq2 = Shift(seq1, 1, -3) - + seq3 = SegmentationExtract(seq1, 1, 3) seq4 = SegmentationExtract(seq1, 1, 4) - Plot(ExtractHistogram(seq3, "Recurrence", 1), ExtractHistogram(seq4, "Recurrence", 1)) + Plot( + ExtractHistogram(seq3, "Recurrence", 1), ExtractHistogram(seq4, "Recurrence", 1) + ) Plot(ExtractHistogram(seq3, "Sojourn", 1), ExtractHistogram(seq4, "Sojourn", 1)) - Plot(ExtractHistogram(seq3, "Recurrence", 2), ExtractHistogram(seq4, "Recurrence", 2)) + Plot( + ExtractHistogram(seq3, "Recurrence", 2), ExtractHistogram(seq4, "Recurrence", 2) + ) Plot(ExtractHistogram(seq3, "Sojourn", 2), ExtractHistogram(seq4, "Sojourn", 2)) - - Plot(ExtractHistogram(seq4, "Recurrence", 2), ExtractHistogram(seq4, "Recurrence", 3), ExtractHistogram(seq4, "Recurrence", 4)) - + + Plot( + ExtractHistogram(seq4, "Recurrence", 2), + ExtractHistogram(seq4, "Recurrence", 3), + ExtractHistogram(seq4, "Recurrence", 4), + ) + matrix20 = Compare(seq1, VectorDistance("N", "N")) Plot(matrix20) Display(Clustering(matrix20, "Partition", 2)) Clustering(matrix20, "Hierarchy") - + matrix21 = Compare(seq1, VectorDistance("O", "O")) Plot(matrix21) Display(Clustering(matrix21, "Partition", 2)) Clustering(matrix21, "Hierarchy") - - seq11 = SelectIndividual(seq2, [18, 9, 10, 31, 6, 14, 29, 16, 1, 12, 5, 7, 25, 22, 17, 30, 13, 4, 21, 27, 20, 24]) + + seq11 = SelectIndividual( + seq2, + [ + 18, + 9, + 10, + 31, + 6, + 14, + 29, + 16, + 1, + 12, + 5, + 7, + 25, + 22, + 17, + 30, + 13, + 4, + 21, + 27, + 20, + 24, + ], + ) seq12 = SelectIndividual(seq2, [28, 19, 32, 23, 26, 11, 3, 15, 8, 33, 2]) - #todo - #Plot(ExtractHistogram(seq11, "FirstOccurrence", 1, 0), ExtractHistogram(seq12, "FirstOccurrence", 1, 0)) - ComparisonTest("W", ExtractHistogram(seq11, "Length"), ExtractHistogram(seq12, "Length")) + # todo + # Plot(ExtractHistogram(seq11, "FirstOccurrence", 1, 0), ExtractHistogram(seq12, "FirstOccurrence", 1, 0)) + ComparisonTest( + "W", ExtractHistogram(seq11, "Length"), ExtractHistogram(seq12, "Length") + ) Plot(ExtractHistogram(seq11, "Length"), ExtractHistogram(seq12, "Length")) - - #todo - #Plot(seq2, "Intensity", 1) - - #Plot(seq2, "Intensity", 2) + + # todo + # Plot(seq2, "Intensity", 1) + + # Plot(seq2, "Intensity", 2) seq5 = RemoveRun(seq2, 2, 0, "End") Plot(seq5, "Intensity", 1) - - + if __name__ == "__main__": test1() - - - diff --git a/test/test_exploratory5.py b/test/test_exploratory5.py index a196e53..1bf981c 100644 --- a/test/test_exploratory5.py +++ b/test/test_exploratory5.py @@ -18,65 +18,80 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import ( + Cluster, + Clustering, + Compare, + Display, + ExtractHistogram, + Merge, + Plot, + Reverse, + Sequences, + VectorDistance, +) +from .tools import robust_path as get_shared_data + def test1(): - seq20 = Sequences(str(get_shared_data("belren1.seq"))) seq21 = Sequences(str(get_shared_data("elstar1.seq"))) seq22 = Sequences(str(get_shared_data("fuji1.seq"))) seq23 = Sequences(str(get_shared_data("gala1.seq"))) seq24 = Sequences(str(get_shared_data("granny1.seq"))) seq25 = Sequences(str(get_shared_data("reinet1.seq"))) - + Display(seq25, ViewPoint="Data") Plot(seq25, "Intensity") Plot(seq25, "Sojourn") - + seq26 = Reverse(seq25) Plot(seq26, "Intensity") Plot(seq26, "FirstOccurrence") - + # Sojourn time (run length) distributions - + seq30 = Merge(seq20, seq21, seq22, seq23, seq24, seq25) Plot(seq30, "Sojourn") - Plot(ExtractHistogram(seq30, "Sojourn", 1), ExtractHistogram(seq30, "Sojourn", 2), ExtractHistogram(seq30, "Sojourn", 3), ExtractHistogram(seq30, "Sojourn", 4)) - - #todo - #mc30 = Estimate(seq30, "MARKOV", MaxOrder=4) - - #todo does not work in aml either + Plot( + ExtractHistogram(seq30, "Sojourn", 1), + ExtractHistogram(seq30, "Sojourn", 2), + ExtractHistogram(seq30, "Sojourn", 3), + ExtractHistogram(seq30, "Sojourn", 4), + ) + + # todo + # mc30 = Estimate(seq30, "MARKOV", MaxOrder=4) + + # todo does not work in aml either # Plot(mc30, "Sojourn") - #Display(Estimate(seq30, "MARKOV")) - + # Display(Estimate(seq30, "MARKOV")) + seq31 = Cluster(seq30, "Limit", [1, 4]) - #todo - #mc31 = Estimate(seq31, "MARKOV", Order=2) - + # todo + # mc31 = Estimate(seq31, "MARKOV", Order=2) + # Plot(mc31, "Sojourn") # Display(Estimate(seq31, "MARKOV")) - + # comparison of sequences by dynamic programming algorithms - + seq32 = Merge(seq20, seq25) matrix30 = Compare(seq32) matrix31 = Compare(seq32, VectorDistance("S")) matrix32 = Compare(seq32, VectorDistance("S"), Transposition=True) - matrix33 = Compare(seq32, VectorDistance(str(get_shared_data("test_align1.a"))), Transposition=True) - - #todo + matrix33 = Compare( + seq32, VectorDistance(str(get_shared_data("test_align1.a"))), Transposition=True + ) + + # todo Display(Clustering(matrix33, "Partition", 2)) Clustering(matrix33, "Hierarchy") - + Compare(seq25, TestSequence=9, RefSequence=1) Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1) - Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1, Transposition=True) - - -if __name__ == "__main__": - test1() - - + Compare( + seq25, VectorDistance("S"), TestSequence=9, RefSequence=1, Transposition=True + ) diff --git a/test/test_exploratory6.py b/test/test_exploratory6.py index 494c085..7c26971 100644 --- a/test/test_exploratory6.py +++ b/test/test_exploratory6.py @@ -17,87 +17,130 @@ # ######################################################################### """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from openalea.sequence_analysis.compare import Compare as Compare -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis import ( + Clustering, + Compare, + ComputeCorrelation, + ComputeWhiteNoiseCorrelation, + Convolution, + Difference, + Display, + Distribution, + Merge, + MovingAverage, + Plot, + Regression, + SelectIndividual, + SelectVariable, + Sequences, + VariableScaling, + VectorDistance, + Vectors, +) +from .tools import robust_path as get_shared_data -def test1(): +def test1(): seq66 = Sequences(str(get_shared_data("laricio_date66.seq"))) Plot(seq66, ViewPoint="Data") - #Plot(Cumulate(seq66), ViewPoint="Data") - + # Plot(Cumulate(seq66), ViewPoint="Data") + vec66 = Vectors(seq66) regress66_1 = Regression(vec66, "MovingAverage", 1, 2, [1]) Plot(regress66_1) regress66_2 = Regression(vec66, "MovingAverage", 1, 3, [1]) - + regress66_23 = Regression(vec66, "NearestNeighbours", 2, 3, 0.3) Display(regress66_23) Plot(regress66_23) - - vec70 = Vectors(SelectIndividual(seq66, [1, 2, 3])) + + vec70 = Vectors(SelectIndividual(seq66, [1, 2, 3])) regress70_1 = Regression(vec70, "MovingAverage", 1, 2, [1]) Plot(regress70_1) regress70_2 = Regression(vec70, "MovingAverage", 1, 3, [1]) - - vec71 = Vectors(SelectIndividual(seq66, [4, 5, 6])) + + vec71 = Vectors(SelectIndividual(seq66, [4, 5, 6])) regress71_1 = Regression(vec71, "MovingAverage", 1, 2, [1]) Plot(regress71_1) regress71_2 = Regression(vec71, "MovingAverage", 1, 3, [1]) - - matrix66 = Compare(SelectVariable(seq66, 1, Mode="Reject"), VectorDistance("N", "N")) + + matrix66 = Compare( + SelectVariable(seq66, 1, Mode="Reject"), VectorDistance("N", "N") + ) Display(Clustering(matrix66, "Partition", 3)) Clustering(matrix66, "Hierarchy") - + # extraction of trends (slowly varying component) and residuals (rapidly varying component) # by symmetric smoothing filters and computation of sample autocorrelation functions from residuals - + seq67 = Difference(seq66) - acf11 = Merge(ComputeCorrelation(seq67, 2, MaxLag=10),\ - ComputeCorrelation(seq67, 3, MaxLag=10)) - acf11 = Merge(ComputeCorrelation(seq67, 2, MaxLag=10, Normalization="Exact"),\ - ComputeCorrelation(seq67, 3, MaxLag=10, Normalization="Exact")) + acf11 = Merge( + ComputeCorrelation(seq67, 2, MaxLag=10), ComputeCorrelation(seq67, 3, MaxLag=10) + ) + acf11 = Merge( + ComputeCorrelation(seq67, 2, MaxLag=10, Normalization="Exact"), + ComputeCorrelation(seq67, 3, MaxLag=10, Normalization="Exact"), + ) ComputeWhiteNoiseCorrelation(acf11, 1) Plot(acf11) - + # symmetric smoothing filters of half-width 3 - + filter1 = Convolution(Distribution("B", 0, 3, 0.2), Distribution("B", 0, 3, 0.8)) - filter2 = Convolution(Distribution("B", 0, 2, 0.2), Distribution("B", 0, 2, 0.5), Distribution("B", 0, 2, 0.8)) - filter3 = Convolution(Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2)) + filter2 = Convolution( + Distribution("B", 0, 2, 0.2), + Distribution("B", 0, 2, 0.5), + Distribution("B", 0, 2, 0.8), + ) + filter3 = Convolution( + Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2) + ) filter4 = Convolution(Distribution("U", 0, 3), Distribution("U", 0, 3)) - Plot(filter1, filter2, Distribution("B", 0, 6, 0.5), filter3, filter4, Distribution("U", 0, 6)) - + Plot( + filter1, + filter2, + Distribution("B", 0, 6, 0.5), + filter3, + filter4, + Distribution("U", 0, 6), + ) + seq68 = MovingAverage(seq66, Distribution("B", 0, 6, 0.5), BeginEnd=True) - - seq69 = MovingAverage(VariableScaling(seq66, 3, 100), Distribution("B", 0, 6, 0.5), BeginEnd=True, Output="Residual") - acf12 = Merge(ComputeCorrelation(seq69, 2, MaxLag=10),\ - ComputeCorrelation(seq69, 3, MaxLag=10)) - acf12 = Merge(ComputeCorrelation(seq69, 2, MaxLag=10, Normalization="Exact"),\ - ComputeCorrelation(seq69, 3, MaxLag=10, Normalization="Exact")) + + seq69 = MovingAverage( + VariableScaling(seq66, 3, 100), + Distribution("B", 0, 6, 0.5), + BeginEnd=True, + Output="Residual", + ) + acf12 = Merge( + ComputeCorrelation(seq69, 2, MaxLag=10), ComputeCorrelation(seq69, 3, MaxLag=10) + ) + acf12 = Merge( + ComputeCorrelation(seq69, 2, MaxLag=10, Normalization="Exact"), + ComputeCorrelation(seq69, 3, MaxLag=10, Normalization="Exact"), + ) ComputeWhiteNoiseCorrelation(acf12, Distribution("B", 0, 6, 0.5)) Plot(acf12) - + seq70 = MovingAverage(seq66, [1, 1, 1], BeginEnd=True) - seq71 = MovingAverage(VariableScaling(seq66, 3, 100), [1, 1, 1], BeginEnd=True, Output="Residual") - acf13 = Merge(ComputeCorrelation(seq71, 2, MaxLag=10),\ - ComputeCorrelation(seq71, 3, MaxLag=10)) - acf13 = Merge(ComputeCorrelation(seq71, 2, MaxLag=10, Normalization="Exact"),\ - ComputeCorrelation(seq71, 3, MaxLag=10, Normalization="Exact")) + seq71 = MovingAverage( + VariableScaling(seq66, 3, 100), [1, 1, 1], BeginEnd=True, Output="Residual" + ) + acf13 = Merge( + ComputeCorrelation(seq71, 2, MaxLag=10), ComputeCorrelation(seq71, 3, MaxLag=10) + ) + acf13 = Merge( + ComputeCorrelation(seq71, 2, MaxLag=10, Normalization="Exact"), + ComputeCorrelation(seq71, 3, MaxLag=10, Normalization="Exact"), + ) ComputeWhiteNoiseCorrelation(acf13, [1, 1, 1]) Plot(acf13) - - seq80 = Sequences(str(get_shared_data( "laricio_position66.seq")), OldFormat=True) - - #Plot(Cumulate(seq80), ViewPoint="Data") - - -if __name__ == "__main__": - test1() - + seq80 = Sequences(str(get_shared_data("laricio_position66.seq")), OldFormat=True) + # Plot(Cumulate(seq80), ViewPoint="Data") diff --git a/test/test_extract_distribution.py b/test/test_extract_distribution.py index 1ef8e11..729c26f 100644 --- a/test/test_extract_distribution.py +++ b/test/test_extract_distribution.py @@ -9,7 +9,7 @@ from openalea.stat_tool.data_transform import ExtractDistribution from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data def test_hidden_semi_markov(): @@ -35,4 +35,4 @@ def test_top_param(): test_hidden_semi_markov() test_renewal() test_semi_markov() - test_top_param() \ No newline at end of file + test_top_param() diff --git a/test/test_extract_histogram.py b/test/test_extract_histogram.py index 9e33925..898d0a8 100644 --- a/test/test_extract_histogram.py +++ b/test/test_extract_histogram.py @@ -10,7 +10,7 @@ from openalea.stat_tool.data_transform import ValueSelect, ExtractHistogram from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data seq = Sequences(str(get_shared_data("pin_laricio_7x.seq"))) seq_cluster = Cluster(seq, "Step", 1, 10) diff --git a/test/test_extract_parameter_index.py b/test/test_extract_parameter_index.py index ff61cc3..557c4f9 100644 --- a/test/test_extract_parameter_index.py +++ b/test/test_extract_parameter_index.py @@ -7,7 +7,7 @@ from openalea.sequence_analysis.data_transform import IndexParameterExtract from openalea.sequence_analysis.sequences import Sequences -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data def test1(): """FIXME markovian_sequences call""" diff --git a/test/test_extract_vectors.py b/test/test_extract_vectors.py index 9632c9e..9a55218 100644 --- a/test/test_extract_vectors.py +++ b/test/test_extract_vectors.py @@ -7,7 +7,7 @@ from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data seq0 = Sequences(str(get_shared_data("chene_sessile_15pa.seq"))) diff --git a/test/test_functional.py b/test/test_functional.py deleted file mode 100644 index 07f8768..0000000 --- a/test/test_functional.py +++ /dev/null @@ -1,11 +0,0 @@ -import runpy - - -def _test_functional1(): - runpy.run_module('functional1') - -def test_functional2(): - runpy.run_module('functional2') - -def _test_functional3(): - runpy.run_module('functional3') diff --git a/test/test_functional1.py b/test/test_functional1.py new file mode 100644 index 0000000..5dee186 --- /dev/null +++ b/test/test_functional1.py @@ -0,0 +1,157 @@ +"""functional tests + + +.. todo:: to be done +""" + +__revision__ = "$Id$" + +from openalea.stat_tool import * +from openalea.sequence_analysis import ( + ComputeAutoCorrelation, + ComputeCorrelation, + Estimate, + ExtractHistogram, + ExtractVectors, + HiddenVariableOrderMarkov, + LengthSelect, + Merge, + MergeVariable, + Plot, + RemoveRun, + SegmentationExtract, + Sequences, + Simulate, + Transcode, + WordCount, +) +from .tools import robust_path as get_shared_data + +seq1 = Sequences(str(get_shared_data("dupreziana_20a2.seq"))) # correct +seq2 = RemoveRun(seq1, 1, 0, "End") # correct + +histo21 = ExtractHistogram(seq2, "Recurrence", 1) # correct +histo22 = ExtractHistogram(seq2, "Recurrence", 2) # correct + +seq3 = Sequences(str(get_shared_data("dupreziana_40a2.seq"))) # correct +seq4_0 = RemoveRun(seq3, 2, 0, "End") # correct +seq4 = SegmentationExtract(seq4_0, 1, 2) # correct + + +seq5 = Sequences(str(get_shared_data("dupreziana_60a2.seq"))) # correct +seq6_0 = RemoveRun(seq5, 2, 0, "End") # correct +seq6 = LengthSelect(SegmentationExtract(seq6_0, 1, 2), 1, Mode="Reject") # correct + + +seq7 = Sequences(str(get_shared_data("dupreziana_80a2.seq"))) # correct +seq8_0 = RemoveRun(seq7, 2, 0, "End") # correct +seq8 = SegmentationExtract(seq8_0, 1, 2) # correct + + +seq10 = Merge(seq2, seq4, seq6, seq8) + +seq10_1 = RecurrenceTimeSequences(seq10, 1) +seq10_2 = RecurrenceTimeSequences(seq10, 2) + + +vec10 = MergeVariable( + ExtractVectors(seq10, "Length"), + ExtractVectors(seq10, "NbOccurrence", 1, 1), + ExtractVectors(seq10, "NbOccurrence", 1, 2), + ExtractVectors(seq10, "Cumul"), +) + +seq11 = Transcode(seq10, [0, 1, 0]) +seq12 = Transcode(seq10, [0, 0, 1]) + +acf1 = Merge(ComputeCorrelation(seq11, MaxLag=15), ComputeCorrelation(seq12, MaxLag=15)) + +acf2 = Merge( + ComputeCorrelation(seq11, Type="Spearman", MaxLag=15), + ComputeCorrelation(seq12, Type="Spearman", MaxLag=15), +) +acf3 = Merge( + ComputeCorrelation(seq11, Type="Kendall", MaxLag=15), + ComputeCorrelation(seq12, Type="Kendall", MaxLag=15), +) + + +WordCount(seq10, 3, BeginState=1, EndState=1, MinFrequency=10) +WordCount(seq10, 4, BeginState=2, EndState=2) +WordCount(seq10, 4, BeginState=2, EndState=1) + + +mc10 = Estimate( + seq10, "VARIABLE_ORDER_MARKOV", "Ordinary", MaxOrder=5, GlobalInitialTransition=True +) + +mc11 = Estimate( + seq10, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + MaxOrder=5, + GlobalInitialTransition=False, +) + +Plot(mc11, "Intensity") + +mc12 = Estimate( + seq10, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + Algorithm="LocalBIC", + Threshold=10.0, + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, +) +mc13 = Estimate( + seq10, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + Algorithm="Context", + Threshold=1.0, + MaxOrder=5, + GlobalInitialTransition=False, + GlobalSample=False, +) + +acf11 = ComputeAutoCorrelation(mc11, 1, MaxLag=20) +acf12 = ComputeAutoCorrelation(mc11, 2, MaxLag=20) + +mc2 = Estimate(seq2, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) +mc4 = Estimate(seq4, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) +mc6 = Estimate(seq6, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) +mc8 = Estimate(seq8, "VARIABLE_ORDER_MARKOV", mc11, GlobalInitialTransition=False) + + +# TODO compare functions crashes sometimes +# matrix1 = Compare(Thresholding(mc2, MinProbability=0.001), seq10, Thresholding(mc4, MinProbability=0.001), seq10, Thresholding(mc6, MinProbability=0.001), seq10, Thresholding(mc8, MinProbability=0.001), seq10, 10000) +# matrix2 = Compare(Thresholding(mc2, MinProbability=0.001), seq2, Thresholding(mc4, MinProbability=0.001), seq4, Thresholding(mc6, MinProbability=0.001), seq6, Thresholding(mc8, MinProbability=0.001), seq8, 10000) + + +# Compare(seq10, Thresholding(mc2, MinProbability=0.001), Thresholding(mc4, MinProbability=.001), Thresholding(mc6, MinProbability=0.001), Thresholding(mc8, MinProbability=0.001)) + + +# test # +hmc9 = HiddenVariableOrderMarkov(str(get_shared_data("dupreziana21.hc"))) +hmc10 = Estimate( + seq10, + "HIDDEN_VARIABLE_ORDER_MARKOV", + hmc9, + GlobalInitialTransition=True, + NbIteration=80, +) +hmc11 = Estimate( + seq10, + "HIDDEN_VARIABLE_ORDER_MARKOV", + hmc9, + GlobalInitialTransition=False, + NbIteration=80, +) + + +acf21 = ComputeAutoCorrelation(hmc11, 1, 1, MaxLag=20) +acf22 = ComputeAutoCorrelation(hmc11, 1, 2, MaxLag=20) + +seq15 = Simulate(hmc11, 10000, seq10) diff --git a/test/test_functional2.py b/test/test_functional2.py new file mode 100644 index 0000000..f6f894b --- /dev/null +++ b/test/test_functional2.py @@ -0,0 +1,201 @@ +"""functional tests""" + +__revision__ = "$Id$" + + +from openalea.sequence_analysis import ( + Cluster, + Compare, + Display, + Estimate, + ExtractData, + ExtractHistogram, + HiddenSemiMarkov, + Merge, + Plot, + Reverse, + Sequences, + VectorDistance, +) +from .tools import robust_path as get_shared_data + + +seq20 = Sequences(str(get_shared_data("belren1.seq"))) +seq21 = Sequences(str(get_shared_data("elstar1.seq"))) +seq22 = Sequences(str(get_shared_data("fuji1.seq"))) +seq23 = Sequences(str(get_shared_data("gala1.seq"))) +seq24 = Sequences(str(get_shared_data("granny1.seq"))) +seq25 = Sequences(str(get_shared_data("reinet1.seq"))) +seq26 = Sequences(str(get_shared_data("wij1.seq"))) + +Display(seq25, ViewPoint="Data") +Plot(seq25, "Intensity") +Plot(seq25, "Sojourn") + +seq26 = Reverse(seq25) +Plot(seq26, "Intensity") +Plot(seq26, "FirstOccurrence") + +# Sojourn time (run length) distributions + +seq30 = Merge(seq20, seq21, seq22, seq23, seq24, seq25) +Plot(seq30, "Sojourn") +Plot( + ExtractHistogram(seq30, "Sojourn", 1), + ExtractHistogram(seq30, "Sojourn", 2), + ExtractHistogram(seq30, "Sojourn", 3), + ExtractHistogram(seq30, "Sojourn", 4), +) + +mc30 = Estimate( + seq30, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + MaxOrder=4, + GlobalInitialTransition=False, +) +mc30 = Estimate( + seq30, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + MaxOrder=4, + Algorithm="BIC", + GlobalInitialTransition=False, +) +# todo empty plot +# Plot(mc30, "Sojourn") +Display(Estimate(seq30, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=1)) +Display( + Estimate( + seq30, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + Order=2, + GlobalInitialTransition=False, + ) +) + +seq31 = Cluster(seq30, "Limit", [1, 4]) +mc31 = Estimate( + seq30, + "VARIABLE_ORDER_MARKOV", + "Ordinary", + MaxOrder=4, + GlobalInitialTransition=False, +) +mc31 = Estimate( + seq31, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=2, GlobalInitialTransition=False +) +Plot(mc31, "Sojourn") +Display(Estimate(seq31, "VARIABLE_ORDER_MARKOV", "Ordinary", Order=1)) + +# comparison of sequences by dynamic programming algorithms + +seq32 = Merge(seq20, seq25) +matrix30 = Compare(seq32) +matrix31 = Compare(seq32, VectorDistance("S")) +matrix32 = Compare(seq32, VectorDistance("S"), Transposition=True) +matrix33 = Compare( + seq32, VectorDistance(str(get_shared_data("test_align1.a"))), Transposition=True +) + +Display(Clustering(matrix33, "Partition", 2)) +Clustering(matrix33, "Hierarchy", Algorithm="Agglomerative") +Clustering(matrix33, "Hierarchy", Algorithm="Divisive") + +# multiple alignment + +seq33 = Compare( + SelectIndividual(seq25, [10, 11, 12, 14, 15]), + VectorDistance("S"), + Output="Sequences", + Algorithm="Agglomerative", +) +seq34 = Compare( + SelectIndividual(seq25, [10, 11, 12, 14, 15]), + VectorDistance("S"), + Output="Sequences", + Algorithm="Divisive", +) +seq35 = Compare( + SelectIndividual(seq25, [10, 11, 12, 14, 15]), + VectorDistance("S"), + Output="Sequences", + Algorithm="Ordering", +) + +Compare(seq25, TestSequence=9, RefSequence=1) +Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1) +Compare(seq25, VectorDistance("S"), TestSequence=9, RefSequence=1, Transposition=True) + +# multiple change-point models + +Display(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile") +Display(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile", Output="ChangePoint") +Plot(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile") +Plot(seq25, 14, 6, "Multinomial", ViewPoint="SegmentProfile", Output="ChangePoint") +# hidden semi-Markov chains + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("belren1.hsc"))) +hsmc20 = Estimate(seq20, "HIDDEN_SEMI-MARKOV", hsmc0) + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("elstar1.hsc"))) +hsmc21 = Estimate(seq21, "HIDDEN_SEMI-MARKOV", hsmc0) + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("fuji1.hsc"))) +hsmc22 = Estimate(seq22, "HIDDEN_SEMI-MARKOV", hsmc0) + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("gala1.hsc"))) +hsmc23 = Estimate(seq23, "HIDDEN_SEMI-MARKOV", hsmc0) + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("granny1.hsc"))) +hsmc24 = Estimate(seq24, "HIDDEN_SEMI-MARKOV", hsmc0) + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("reinet1.hsc"))) +hsmc25 = Estimate(seq25, "HIDDEN_SEMI-MARKOV", hsmc0) + +Display(hsmc25) +Plot(hsmc25, "Intensity", 1) +Plot(hsmc25, "FirstOccurrence", 1) +Plot(hsmc25, "Counting", 1) + +# state +Plot(hsmc25, "Intensity") +Plot(hsmc25, "Sojourn") +# observed +Plot(hsmc25, "Sojourn", 1) + +Plot(hsmc25, 1, ViewPoint="StateProfile") +Plot(hsmc25, 1, ViewPoint="StateProfile", Output="InState") +Plot(hsmc25, 1, ViewPoint="StateProfile", Output="OutState") + +seq25_1 = ExtractData(hsmc25) +Display(seq25_1, ViewPoint="Data", Format="Line") + +hsmc0 = HiddenSemiMarkov(str(get_shared_data("wij1.hsc"))) +hsmc26 = Estimate(seq26, "HIDDEN_SEMI-MARKOV", hsmc0) + +# model comparison + +# Thresholding(hsmc20, MinProbability=0.001) +# Thresholding(hsmc21, MinProbability=0.001) +# Thresholding(hsmc22, MinProbability=0.001) +# Thresholding(hsmc23, MinProbability=0.001) +# Thresholding(hsmc24, MinProbability=0.001) +# Thresholding(hsmc25, MinProbability=0.001) +# Thresholding(hsmc26, MinProbability=0.001) + + +# matrix20 = Compare(Thresholding(hsmc22, MinProbability=0.001), seq22, 10000) + +# matrix20 = Compare(Thresholding(hsmc20, MinProbability=0.001), seq20, Thresholding(hsmc21, MinProbability=0.001), seq21, Thresholding(hsmc22, MinProbability=0.001), seq22, Thresholding(hsmc24, MinProbability=0.001), seq24, Thresholding(hsmc25, MinProbability=0.001), seq25, Thresholding(hsmc26, MinProbability=0.001), seq26, 10000) + +# TODO unstable the line above works, the line below does not +# matrix20 = Compare(Thresholding(hsmc20, MinProbability=0.001), seq20, Thresholding(hsmc21, MinProbability=0.001), seq21, Thresholding(hsmc22, MinProbability=0.001), seq22, Thresholding(hsmc23, MinProbability=0.001), seq23, Thresholding(hsmc24, MinProbability=0.001), seq24, Thresholding(hsmc25, MinProbability=0.001), seq25, Thresholding(hsmc26, MinProbability=0.001), seq26, 10000, FileName="ASCII/cultivar1_models.txt") + +# may be slow +# matrix21 = Compare(Thresholding(hsmc20, MinProbability=0.001), Thresholding(hsmc21, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc24, MinProbability=0.001), Thresholding(hsmc25, MinProbability=0.001), Thresholding(hsmc26, MinProbability=0.001), 100, 90) +# matrix21 = Compare(Thresholding(hsmc20, MinProbability=0.001), Thresholding(hsmc21, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc22, MinProbability=0.001), Thresholding(hsmc24, MinProbability=0.001), Thresholding(hsmc25, MinProbability=0.001), Thresholding(hsmc26, MinProbability=0.001), 100, 90, FileName="ASCII/cultivar1_models_90.txt") + + +# Plot(matrix20) diff --git a/test/functional3.py b/test/test_functional3.py similarity index 50% rename from test/functional3.py rename to test/test_functional3.py index 97061ba..91d0f4d 100644 --- a/test/functional3.py +++ b/test/test_functional3.py @@ -19,18 +19,48 @@ # ######################################################################### """ -__revision__ = "$Id$" +__revision__ = "$Id$" -import os -from openalea.sequence_analysis import * -from openalea.sequence_analysis.estimate import Estimate -from openalea.sequence_analysis.compare import Compare -from tools import runTestClass, robust_path as get_shared_data -seq69 = Sequences(str(get_shared_data( "pin_laricio_7x.seq"))) +from openalea.sequence_analysis import ( + Cluster, + Clustering, + Compare, + ComputeCorrelation, + ComputeWhiteNoiseCorrelation, + Convolution, + Cumulate, + Difference, + Display, + Distribution, + Estimate, + ExtractData, + ExtractDistribution, + ExtractHistogram, + Fit, + HiddenSemiMarkov, + Merge, + MergeVariable, + Mixture, + MovingAverage, + Plot, + PointwiseAverage, + Regression, + SelectIndividual, + SelectVariable, + Segmentation, + SegmentationExtract, + Sequences, + SojournTimeSequences, + VectorDistance, + Vectors, +) +from .tools import robust_path as get_shared_data + +seq69 = Sequences(str(get_shared_data("pin_laricio_7x.seq"))) seq70 = Cluster(seq69, "Step", 1, 10) -#seq70 = IndexParameterExtract(Cluster(seq69, "Step", 2, 10), 1927, MaxIndex=1992) +# seq70 = IndexParameterExtract(Cluster(seq69, "Step", 2, 10), 1927, MaxIndex=1992) seq2 = SelectVariable(seq70, 1) Plot(seq2, 2, 5, "Gaussian", ViewPoint="SegmentProfile") @@ -42,7 +72,7 @@ Plot(Regression(vec70, "MovingAverage", 1, 2, [1])) Plot(Regression(vec70, "MovingAverage", 1, 3, [1])) -vec71 = Vectors(SelectIndividual(seq70, [1, 2, 3])) +vec71 = Vectors(SelectIndividual(seq70, [1, 2, 3])) Plot(Regression(vec71, "MovingAverage", 1, 2, [1])) Plot(Regression(vec71, "MovingAverage", 1, 3, [1])) @@ -51,11 +81,13 @@ Plot(SelectIndividual(seq71, [0, 4]), ViewPoint="Data") seq72 = PointwiseAverage(SelectIndividual(seq70, [1, 2, 3]), Output="Residual") -seq72 = PointwiseAverage(SelectIndividual(seq70, [1, 2, 3]), Output="StandardizedResidual") +seq72 = PointwiseAverage( + SelectIndividual(seq70, [1, 2, 3]), Output="StandardizedResidual" +) Plot(SelectIndividual(seq72, [1, 2, 3]), ViewPoint="Data") Plot(SelectIndividual(Cumulate(seq72), [1, 2, 3]), ViewPoint="Data") -vec73 = Vectors(SelectIndividual(seq70, [4, 5, 6])) +vec73 = Vectors(SelectIndividual(seq70, [4, 5, 6])) Plot(Regression(vec73, "MovingAverage", 1, 2, [1])) Plot(Regression(vec73, "MovingAverage", 1, 3, [1])) @@ -64,13 +96,15 @@ Plot(SelectIndividual(seq73, [3, 7]), ViewPoint="Data") seq74 = PointwiseAverage(SelectIndividual(seq70, [4, 5, 6]), Output="Residual") -seq74 = PointwiseAverage(SelectIndividual(seq70, [4, 5, 6]), Output="StandardizedResidual") +seq74 = PointwiseAverage( + SelectIndividual(seq70, [4, 5, 6]), Output="StandardizedResidual" +) Plot(SelectIndividual(seq74, [4, 5, 6]), ViewPoint="Data") Plot(SelectIndividual(Cumulate(seq74), [4, 5, 6]), ViewPoint="Data") -matrix70 = Compare(seq70, VectorDistance("N", "N"), IndelFactor=1., End="Free") -matrix70 = Compare(seq70, VectorDistance("N", "N"), IndelFactor=1.) +matrix70 = Compare(seq70, VectorDistance("N", "N"), IndelFactor=1.0, End="Free") +matrix70 = Compare(seq70, VectorDistance("N", "N"), IndelFactor=1.0) Display(Clustering(matrix70, "Partition", 3)) Clustering(matrix70, "Hierarchy") @@ -78,30 +112,65 @@ # by symmetric smoothing filters and computation of sample autocorrelation functions from residuals seq75 = Difference(seq70) -acf11 = Merge(ComputeCorrelation(seq75, 1, MaxLag=10), ComputeCorrelation(seq75, 2, MaxLag=10)) +acf11 = Merge( + ComputeCorrelation(seq75, 1, MaxLag=10), ComputeCorrelation(seq75, 2, MaxLag=10) +) ComputeWhiteNoiseCorrelation(acf11, 1) Plot(acf11) # symmetric smoothing filters of half-width 3 filter1 = Convolution(Distribution("B", 0, 6, 0.2), Distribution("B", 0, 6, 0.8)) -filter2 = Convolution(Distribution("B", 0, 4, 0.2), Distribution("B", 0, 4, 0.5), Distribution("B", 0, 4, 0.8)) -filter3 = Convolution(Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2), Distribution("U", 0, 2)) -filter4 = Convolution(Distribution("U", 0, 3), Distribution("U", 0, 3), Distribution("U", 0, 3), Distribution("U", 0, 3)) -filter5 = Convolution(Distribution("U", 0, 4), Distribution("U", 0, 4), Distribution("U", 0, 4)) +filter2 = Convolution( + Distribution("B", 0, 4, 0.2), + Distribution("B", 0, 4, 0.5), + Distribution("B", 0, 4, 0.8), +) +filter3 = Convolution( + Distribution("U", 0, 2), + Distribution("U", 0, 2), + Distribution("U", 0, 2), + Distribution("U", 0, 2), + Distribution("U", 0, 2), + Distribution("U", 0, 2), +) +filter4 = Convolution( + Distribution("U", 0, 3), + Distribution("U", 0, 3), + Distribution("U", 0, 3), + Distribution("U", 0, 3), +) +filter5 = Convolution( + Distribution("U", 0, 4), Distribution("U", 0, 4), Distribution("U", 0, 4) +) filter6 = Convolution(Distribution("U", 0, 6), Distribution("U", 0, 6)) -Plot(filter1, filter2, Distribution("B", 0, 12, 0.5), filter3, filter4, filter5, filter6, Distribution("U", 0, 12)) +Plot( + filter1, + filter2, + Distribution("B", 0, 12, 0.5), + filter3, + filter4, + filter5, + filter6, + Distribution("U", 0, 12), +) seq76 = MovingAverage(seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True) -seq77 = MovingAverage(seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True, Output="Residual") -acf12 = Merge(ComputeCorrelation(seq73, 1, MaxLag=10), ComputeCorrelation(seq73, 2, MaxLag=10)) +seq77 = MovingAverage( + seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True, Output="Residual" +) +acf12 = Merge( + ComputeCorrelation(seq73, 1, MaxLag=10), ComputeCorrelation(seq73, 2, MaxLag=10) +) ComputeWhiteNoiseCorrelation(acf12, Distribution("B", 0, 6, 0.5)) Plot(acf12) seq78 = MovingAverage(seq70, [1, 1, 1], BeginEnd=True) seq79 = MovingAverage(seq70, [1, 1, 1], BeginEnd=True, Output="Residual") -acf13 = Merge(ComputeCorrelation(seq75, 1, MaxLag=10), ComputeCorrelation(seq75, 2, MaxLag=10)) +acf13 = Merge( + ComputeCorrelation(seq75, 1, MaxLag=10), ComputeCorrelation(seq75, 2, MaxLag=10) +) ComputeWhiteNoiseCorrelation(acf13, [1, 1, 1]) Plot(acf13) @@ -125,21 +194,45 @@ # multivariate segmentation -Display(seq70, 5, 4, "Gaussian", "Gaussian", ViewPoint="SegmentProfile", NbSegmentation=5) +Display( + seq70, 5, 4, "Gaussian", "Gaussian", ViewPoint="SegmentProfile", NbSegmentation=5 +) Plot(seq70, 5, 4, "Gaussian", "Gaussian", ViewPoint="SegmentProfile") -Plot(seq70, 5, 4, "Gaussian", "Gaussian", ViewPoint="SegmentProfile", Output="ChangePoint") +Plot( + seq70, + 5, + 4, + "Gaussian", + "Gaussian", + ViewPoint="SegmentProfile", + Output="ChangePoint", +) # estimation of a hidden semi-Markov chain -hmc60 = HiddenSemiMarkov(str(get_shared_data( "pin_laricio_6.hsc"))) +hmc60 = HiddenSemiMarkov(str(get_shared_data("pin_laricio_6.hsc"))) hmc6 = Estimate(seq70, "HIDDEN_SEMI-MARKOV", hmc60) -hsmc60 = HiddenSemiMarkov(str(get_shared_data( "pin_laricio_6.hsc"))) +hsmc60 = HiddenSemiMarkov(str(get_shared_data("pin_laricio_6.hsc"))) hsmc6 = Estimate(seq70, "HIDDEN_SEMI-MARKOV", hsmc60) hsmc61 = Estimate(seq70, "HIDDEN_SEMI-MARKOV", "Ordinary", 6, "LeftRight") -Plot(ExtractDistribution(hsmc6, "Observation", 1, 0), ExtractDistribution(hsmc6, "Observation", 1, 1), ExtractDistribution(hsmc6, "Observation", 1, 2), ExtractDistribution(hsmc6, "Observation", 1, 3), ExtractDistribution(hsmc6, "Observation", 1, 4), ExtractDistribution(hsmc6, "Observation", 1, 5)) -Plot(ExtractDistribution(hsmc6, "Observation", 2, 0), ExtractDistribution(hsmc6, "Observation", 2, 1), ExtractDistribution(hsmc6, "Observation", 2, 2), ExtractDistribution(hsmc6, "Observation", 2, 3), ExtractDistribution(hsmc6, "Observation", 2, 4), ExtractDistribution(hsmc6, "Observation", 2, 5)) +Plot( + ExtractDistribution(hsmc6, "Observation", 1, 0), + ExtractDistribution(hsmc6, "Observation", 1, 1), + ExtractDistribution(hsmc6, "Observation", 1, 2), + ExtractDistribution(hsmc6, "Observation", 1, 3), + ExtractDistribution(hsmc6, "Observation", 1, 4), + ExtractDistribution(hsmc6, "Observation", 1, 5), +) +Plot( + ExtractDistribution(hsmc6, "Observation", 2, 0), + ExtractDistribution(hsmc6, "Observation", 2, 1), + ExtractDistribution(hsmc6, "Observation", 2, 2), + ExtractDistribution(hsmc6, "Observation", 2, 3), + ExtractDistribution(hsmc6, "Observation", 2, 4), + ExtractDistribution(hsmc6, "Observation", 2, 5), +) # 1, 3, 5 Plot(hsmc6, 5, ViewPoint="StateProfile") @@ -151,26 +244,77 @@ Display(seq61, ViewPoint="Data", Format="Line") - - - -mixt61 = Mixture(21. / 406., ExtractDistribution(hsmc6, "Observation", 1, 0), 29. / 406., ExtractDistribution(hsmc6, "Observation", 1, 1), 140. / 406., ExtractDistribution(hsmc6, "Observation", 1, 2), 87. / 406., ExtractDistribution(hsmc6, "Observation", 1, 3), 71. / 406., ExtractDistribution(hsmc6, "Observation", 1, 4), 58. / 406., ExtractDistribution(hsmc6, "Observation", 1, 5)) -mixt61 = Mixture(0.0497296, ExtractDistribution(hsmc6, "Observation", 1, 0), 0.0750034, ExtractDistribution(hsmc6, "Observation", 1, 1), 0.3416, ExtractDistribution(hsmc6, "Observation", 1, 2), 0.207806, ExtractDistribution(hsmc6, "Observation", 1, 3), 0.159426, ExtractDistribution(hsmc6, "Observation", 1, 4), 0.166434, ExtractDistribution(hsmc6, "Observation", 1, 5)) +mixt61 = Mixture( + 21.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 0), + 29.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 1), + 140.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 2), + 87.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 3), + 71.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 4), + 58.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 1, 5), +) +mixt61 = Mixture( + 0.0497296, + ExtractDistribution(hsmc6, "Observation", 1, 0), + 0.0750034, + ExtractDistribution(hsmc6, "Observation", 1, 1), + 0.3416, + ExtractDistribution(hsmc6, "Observation", 1, 2), + 0.207806, + ExtractDistribution(hsmc6, "Observation", 1, 3), + 0.159426, + ExtractDistribution(hsmc6, "Observation", 1, 4), + 0.166434, + ExtractDistribution(hsmc6, "Observation", 1, 5), +) Plot(Fit(ExtractHistogram(seq70, "Value", 1), ExtractDistribution(mixt61, "Mixture"))) -mixt62 = Mixture(21. / 406., ExtractDistribution(hsmc6, "Observation", 2, 0), 29. / 406., ExtractDistribution(hsmc6, "Observation", 2, 1), 140. / 406., ExtractDistribution(hsmc6, "Observation", 2, 2), 87. / 406., ExtractDistribution(hsmc6, "Observation", 2, 3), 71. / 406., ExtractDistribution(hsmc6, "Observation", 2, 4), 58. / 406., ExtractDistribution(hsmc6, "Observation", 2, 5)) -mixt62 = Mixture(0.0497296, ExtractDistribution(hsmc6, "Observation", 2, 0), 0.0750034, ExtractDistribution(hsmc6, "Observation", 2, 1), 0.3416, ExtractDistribution(hsmc6, "Observation", 2, 2), 0.207806, ExtractDistribution(hsmc6, "Observation", 2, 3), 0.159426, ExtractDistribution(hsmc6, "Observation", 2, 4), 0.166434, ExtractDistribution(hsmc6, "Observation", 2, 5)) +mixt62 = Mixture( + 21.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 0), + 29.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 1), + 140.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 2), + 87.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 3), + 71.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 4), + 58.0 / 406.0, + ExtractDistribution(hsmc6, "Observation", 2, 5), +) +mixt62 = Mixture( + 0.0497296, + ExtractDistribution(hsmc6, "Observation", 2, 0), + 0.0750034, + ExtractDistribution(hsmc6, "Observation", 2, 1), + 0.3416, + ExtractDistribution(hsmc6, "Observation", 2, 2), + 0.207806, + ExtractDistribution(hsmc6, "Observation", 2, 3), + 0.159426, + ExtractDistribution(hsmc6, "Observation", 2, 4), + 0.166434, + ExtractDistribution(hsmc6, "Observation", 2, 5), +) Plot(Fit(ExtractHistogram(seq70, "Value", 2), ExtractDistribution(mixt62, "Mixture"))) # comparason with the segmentations deduced from the 6-state hidden semi-Markov chain -seq46 = Merge( Segmentation(seq70, 1, [1935, 1961, 1972, 1990], "Gaussian", "Gaussian"), -Segmentation(seq70, 2, [1932, 1936, 1961, 1984, 1986], "Gaussian", "Gaussian"), -Segmentation(seq70, 3, [1932, 1949, 1971, 1985, 1990], "Gaussian", "Gaussian"), -Segmentation(seq70, 4, [1930, 1953, 1963, 1977], "Gaussian", "Gaussian"), -Segmentation(seq70, 5, [1931, 1963, 1975, 1991], "Gaussian", "Gaussian"), -Segmentation(seq70, 6, [1931, 1943, 1960, 1976], "Gaussian", "Gaussian")) +seq46 = Merge( + Segmentation(seq70, 1, [1935, 1961, 1972, 1990], "Gaussian", "Gaussian"), + Segmentation(seq70, 2, [1932, 1936, 1961, 1984, 1986], "Gaussian", "Gaussian"), + Segmentation(seq70, 3, [1932, 1949, 1971, 1985, 1990], "Gaussian", "Gaussian"), + Segmentation(seq70, 4, [1930, 1953, 1963, 1977], "Gaussian", "Gaussian"), + Segmentation(seq70, 5, [1931, 1963, 1975, 1991], "Gaussian", "Gaussian"), + Segmentation(seq70, 6, [1931, 1943, 1960, 1976], "Gaussian", "Gaussian"), +) seq47 = SelectVariable(seq46, [3, 5]) Plot(seq47, ViewPoint="Data") @@ -179,7 +323,7 @@ seq49 = SelectVariable(seq48, [3]) # these two lines works together # seq47 = SelectVariable(seq46, [3]) -#Plot(Merge(SelectIndividual(seq47, [1]), SelectIndividual(seq49, [1])), ViewPoint=Data) +# Plot(Merge(SelectIndividual(seq47, [1]), SelectIndividual(seq49, [1])), ViewPoint=Data) # analyse des residus @@ -191,7 +335,14 @@ acf50 = ComputeCorrelation(seq50, 1, MaxLag=10) Plot(acf50) -seq51 = Merge(SegmentationExtract(seq50, 1, 0), SegmentationExtract(seq50, 1, 1), SegmentationExtract(seq50, 1, 2), SegmentationExtract(seq50, 1, 3), SegmentationExtract(seq50, 1, 4), SegmentationExtract(seq50, 1, 5)) +seq51 = Merge( + SegmentationExtract(seq50, 1, 0), + SegmentationExtract(seq50, 1, 1), + SegmentationExtract(seq50, 1, 2), + SegmentationExtract(seq50, 1, 3), + SegmentationExtract(seq50, 1, 4), + SegmentationExtract(seq50, 1, 5), +) acf51 = ComputeCorrelation(seq51, MaxLag=10) Plot(acf51) @@ -206,4 +357,3 @@ seq57 = Segmentation(seq80, [5, 5, 5, 4, 4, 4], "Mean") seq58 = Segmentation(seq80, [5, 5, 5, 4, 4, 4], "Gaussian") Display(MergeVariable(SelectVariable(seq57, 1), seq58), ViewPoint="Data", Format="Line") - diff --git a/test/test_hidden_semi_markov.py b/test/test_hidden_semi_markov.py index 69c3a4e..7b01ae5 100644 --- a/test/test_hidden_semi_markov.py +++ b/test/test_hidden_semi_markov.py @@ -21,8 +21,8 @@ import openalea.stat_tool.plot #import DISABLE_PLOT openalea.stat_tool.plot.DISABLE_PLOT = True -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import runTestClass, robust_path as get_shared_data import os diff --git a/test/test_hidden_semi_markov_functional.py b/test/test_hidden_semi_markov_functional.py index 80b2897..5b21e2f 100644 --- a/test/test_hidden_semi_markov_functional.py +++ b/test/test_hidden_semi_markov_functional.py @@ -2,7 +2,7 @@ """tests on mv_mixture""" __version__ = "$Id$" -from openalea.stat_tool import _stat_tool +# from openalea.stat_tool import _stat_tool from openalea.sequence_analysis import _sequence_analysis from openalea.sequence_analysis.hidden_semi_markov import HiddenSemiMarkov from openalea.sequence_analysis.simulate import Simulate @@ -18,8 +18,8 @@ DISABLE_PLOT = False # DISABLE_PLOT = True -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import runTestClass, robust_path as get_shared_data import os @@ -36,8 +36,8 @@ def test1(): set_seed(0) hsm = HiddenSemiMarkov(str(get_shared_data('test_hidden_semi_markov.dat'))) - - hsm.plot("Intensity", 1) + + hsm.plot("Intensity", 1) hsm.plot("Observation", 1) hsm.plot("Counting", 1) hsm.plot("Recurrence", 1) @@ -53,7 +53,7 @@ def test1(): except: pass else: - raise RuntimeError("Failed to raise error") + raise RuntimeError("Failed to raise error") hsm.plot("FirstOccurrence", 1) hsm.plot() @@ -74,11 +74,11 @@ def test1(): from openalea.sequence_analysis import Estimate nb_states = 8 - hsmc_est = Estimate(obs, "HIDDEN_SEMI-MARKOV", "Ordinary", nb_states, "LeftRight", Nbiteration=300) + hsmc_est = Estimate(obs, "HIDDEN_SEMI-MARKOV", "Ordinary", nb_states, "LeftRight", NbIteration=300) print(hsmc_est.display()) # TODO: find adequate error message in - # hsmc_est = Estimate(seq, "HIDDEN_SEMI-MARKOV", "Ordinary", nb_states, "LeftRight", Nbiteration=300) + # hsmc_est = Estimate(seq, "HIDDEN_SEMI-MARKOV", "Ordinary", nb_states, "LeftRight", NbIteration=300) plotter = mplotlib() hsmc_est.plot("Intensity", 1) diff --git a/test/test_hidden_variable_order_markov.py b/test/test_hidden_variable_order_markov.py index b432c5b..1acea84 100644 --- a/test/test_hidden_variable_order_markov.py +++ b/test/test_hidden_variable_order_markov.py @@ -14,10 +14,10 @@ from openalea.stat_tool.cluster import Cluster from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass +from .tools import interface +from .tools import runTestClass -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data class Test(interface): diff --git a/test/test_iterator.py b/test/test_iterator.py index 944ac98..0dab9e7 100644 --- a/test/test_iterator.py +++ b/test/test_iterator.py @@ -1,80 +1,91 @@ -""" Test renewal data structure +"""Test renewal data structure .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id$" +import pytest + from openalea.sequence_analysis import _sequence_analysis as sa -from openalea.sequence_analysis.hidden_variable_order_markov import * -from openalea.sequence_analysis.hidden_semi_markov import * -from openalea.sequence_analysis.renewal import * -from tools import runTestClass, robust_path as get_shared_data +from openalea.sequence_analysis.hidden_variable_order_markov import ( + HiddenVariableOrderMarkov, +) +from openalea.sequence_analysis.hidden_semi_markov import HiddenSemiMarkov +from openalea.sequence_analysis.renewal import Renewal +from .tools import runTestClass, robust_path as get_shared_data N = 10 -import os + + +@pytest.fixture +def create_data_hidden_semi_markov(): + return HiddenSemiMarkov(str(get_shared_data("test_hidden_semi_markov.dat"))) + + # SEMI MARKOV case -def test_semi_markov_iterator(): - hsm = HiddenSemiMarkov(str(get_shared_data('test_hidden_semi_markov.dat'))) +def test_semi_markov_iterator(create_data_hidden_semi_markov): + hsm = create_data_hidden_semi_markov smi = sa._SemiMarkovIterator(hsm) sim = smi.simulation(N, True) + def hsm_iterator(fn): hsm = HiddenSemiMarkov(fn) it = sa._SemiMarkovIterator(hsm) return it -def test_semi_markov_iterator2(): - fn = str(get_shared_data('test_hidden_semi_markov.dat')) + +def test_semi_markov_iterator2(create_data_hidden_semi_markov): + fn = create_data_hidden_semi_markov smi = hsm_iterator(fn) sim = smi.simulation(N, True) + # VARIABLE ORDER MARKOV case -def vom_iterator(fn): + +@pytest.fixture +def create_data_variable_order_markov(): + return str(get_shared_data("dupreziana21.hc")) + + +def vom_iterator(fn): vom = HiddenVariableOrderMarkov(fn) it = sa._VariableOrderMarkovIterator(vom) return it -def test_variable_order_markov_iterator(): - vom = HiddenVariableOrderMarkov(str(get_shared_data('dupreziana21.hc'))) + +def test_variable_order_markov_iterator(create_data_variable_order_markov): + vom = HiddenVariableOrderMarkov(create_data_variable_order_markov) smi = sa._VariableOrderMarkovIterator(vom) sim = smi.simulation(N, True) -def test_variable_order_markov_iterator2(): - fn = str(get_shared_data('dupreziana21.hc')) + +def test_variable_order_markov_iterator2(create_data_variable_order_markov): + fn = create_data_variable_order_markov smi = vom_iterator(fn) sim = smi.simulation(N, True) + # RENEWAL case def renewal_iterator(fn): ren = Renewal(fn) it = sa._RenewalIterator(ren) return it + def _test_renewal_iterator2(): """to be fixed""" fn = path + "abri13.ren" smi = renewal_iterator(fn) sim = smi.simulation(N, True) + def _test_renewal_iterator(): """to be fixed""" ren = Renewal(path + "abri13.ren") print((type(ren))) smi = sa._RenewalIterator(ren) sim = smi.simulation(N, True) - - - -if __name__ == "__main__": - - test_semi_markov_iterator() - test_semi_markov_iterator2() - - test_variable_order_markov_iterator() - test_variable_order_markov_iterator2() - - #test_renewal_iterator() - #test_renewal_iterator2() - diff --git a/test/test_merge.py b/test/test_merge.py index 4196f7f..fce8256 100644 --- a/test/test_merge.py +++ b/test/test_merge.py @@ -1,16 +1,17 @@ """unitary or functional tests on Merge. - See also test_semi_markov, test_time_events and so on - - .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr +See also test_semi_markov, test_time_events and so on + +.. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id$" -from openalea.stat_tool.data_transform import Merge +from openalea.stat_tool.data_transform import Merge -from test_correlation import CorrelationData -from test_tops import TopsData -from test_semi_markov import SemiMarkovData +from .test_correlation import CorrelationData +from .test_tops import TopsData +from .test_semi_markov import SemiMarkovData def test_merge_histo(): @@ -29,11 +30,12 @@ def test_merge_renewal_data(): def test_merge_sequences(): - from test_sequences import Test as sequences_data + from .test_sequences import Test as sequences_data + sequences = sequences_data() data = sequences.build_data() assert Merge(data, data) - + def test_merge_vom_data(): """test not yet implemented""" @@ -44,9 +46,9 @@ def _test_merge_semi_markov_data(): sm1 = SemiMarkovData() sm2 = SemiMarkovData() sm = Merge(sm1, sm2) - - #todo this plot does not work right now ? - #sm.plot() + + # todo this plot does not work right now ? + # sm.plot() def test_merge_nonhomogenesous_markov_data(): @@ -54,25 +56,26 @@ def test_merge_nonhomogenesous_markov_data(): pass -def test_merge_tops(): - t1 = TopsData() - t2 = TopsData() - t = Merge(t1, t2) - t.plot() - +## def test_merge_tops(): +## t1 = TopsData() +## t2 = TopsData() +## t = Merge(t1, t2) +## t.plot() + + def test_merge_correlation(): c1 = CorrelationData(1) c2 = CorrelationData(2) c3 = CorrelationData(3) - c = Merge(c1,c2,c3) - c_bis = c1.merge([c2,c3]) - assert str(c)==str(c_bis) + c = Merge(c1, c2, c3) + c_bis = c1.merge([c2, c3]) + assert str(c) == str(c_bis) c.plot() -if __name__ == "__main__": - test_merge_tops() - test_merge_correlation() - #test_merge_semi_markov_data() - test_merge_sequences() - +## if __name__ == "__main__": +## test_merge_tops() +## test_merge_correlation() +## #test_merge_semi_markov_data() +## test_merge_sequences() +## diff --git a/test/test_moving_average.py b/test/test_moving_average.py index 9546c42..37e5086 100644 --- a/test/test_moving_average.py +++ b/test/test_moving_average.py @@ -1,36 +1,38 @@ -""" Test moving average +"""Test moving average .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo:: to be done """ + __revision__ = "$Id$" -from openalea.sequence_analysis import * -from openalea.stat_tool.distribution import Distribution -from tools import runTestClass +import pytest + +from openalea.sequence_analysis import Cluster, Distribution, MovingAverage, Sequences -seq = Sequences(get_shared_data("pin_laricio_7x.seq")) -seq70 = Cluster(seq, "Step", 1, 10) +from .tools import robust_path as get_shared_data -class Test(): - def __init__(self): - self.data = seq70 +@pytest.fixture +def create_data_moving_average(): + seq = Sequences(get_shared_data("pin_laricio_7x.seq")) + return Cluster(seq, "Step", 1, 10) - def test_distribution(self): - seq70 = self.data + +class Test: + def test_distribution(self, create_data_moving_average): + seq70 = create_data_moving_average MovingAverage(seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True) - MovingAverage(seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True, Output="Residual") + MovingAverage( + seq70, Distribution("B", 0, 16, 0.5), BeginEnd=True, Output="Residual" + ) - def test_frequencies(self): - seq70 = self.data + def test_frequencies(self, create_data_moving_average): + seq70 = create_data_moving_average MovingAverage(seq70, [1, 1, 1], BeginEnd=True) MovingAverage(seq70, [1, 1, 1], BeginEnd=True, Output="Residual") def test_filter(self): """test not yet implemented""" pass - -if __name__ == "__main__": - runTestClass(Test()) diff --git a/test/test_nonhomogeneous.py b/test/test_nonhomogeneous.py index 06da8ae..efdc85e 100644 --- a/test/test_nonhomogeneous.py +++ b/test/test_nonhomogeneous.py @@ -2,40 +2,45 @@ .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id: test_semi_markov.py 8204 2010-02-19 10:27:45Z cokelaer $" +import pytest -#from openalea.stat_tool import _stat_tool -#from openalea.sequence_analysis import _sequence_analysis +# from openalea.stat_tool import _stat_tool +# from openalea.sequence_analysis import _sequence_analysis from openalea.sequence_analysis.nonhomogeneous_markov import NonhomogeneousMarkov -from openalea.sequence_analysis import get_shared_data -#from openalea.sequence_analysis.simulate import Simulate -#from openalea.sequence_analysis.sequences import Sequences -#from openalea.stat_tool.data_transform import * -#from openalea.stat_tool.cluster import Cluster -#from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +# from openalea.sequence_analysis.simulate import Simulate +# from openalea.sequence_analysis.sequences import Sequences +# from openalea.stat_tool.data_transform import * +# from openalea.stat_tool.cluster import Cluster +# from openalea.stat_tool.cluster import Transcode, Cluster + +from .tools import interface +from .tools import robust_path as get_shared_data +@pytest.fixture def NonhomogeneousMarkovData(): - seq = Sequences(str(get_shared_data('vanille_m.seq'))) + seq = Sequences(str(get_shared_data("vanille_m.seq"))) mc_m = Estimate(seq_m, "NONHOMOGENEOUS_MARKOV", "MONOMOLECULAR", "VOID") return mc_m + class Test(interface): - """a simple unittest class for nonhomogeneous data + """a simple unittest class for nonhomogeneous data""" - """ def __init__(self): - interface.__init__(self, - self.build_data(), - str(get_shared_data("test_nonhomogeneous.dat")), - NonhomogeneousMarkov) + interface.__init__( + self, + self.build_data(), + str(get_shared_data("test_nonhomogeneous.dat")), + NonhomogeneousMarkov, + ) def build_data(self): - sm = NonhomogeneousMarkov(str(get_shared_data('test_nonhomogeneous.dat'))) + sm = NonhomogeneousMarkov(str(get_shared_data("test_nonhomogeneous.dat"))) return sm def test_empty(self): @@ -78,7 +83,7 @@ def _test_simulate(self): def test_extract(self): pass - #self.data.extract(0,1) + # self.data.extract(0,1) def test_extract_data(self): pass diff --git a/test/test_renewal.py b/test/test_renewal.py index 90fe73f..ce93ac4 100644 --- a/test/test_renewal.py +++ b/test/test_renewal.py @@ -1,11 +1,13 @@ -""" Test renewal data structure +"""Test renewal data structure .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo:: to be done """ + __revision__ = "$Id$" +import pytest from openalea.stat_tool import _stat_tool from openalea.sequence_analysis import _sequence_analysis @@ -16,69 +18,102 @@ from openalea.sequence_analysis.data_transform import TimeScaling from openalea.sequence_analysis import get_shared_data from openalea.stat_tool.cluster import Cluster -from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import runTestClass, robust_path as get_shared_data + +@pytest.fixture +def build_data_renewal(): + """todo: check identifier output. should be a list""" + # build a list of 2 sequences with a variable that should be identical + # to sequences1.seq + return TimeEvents(str(get_shared_data("test_time_events.dat"))) class Test(interface): - """to be done + """to be done""" - """ def __init__(self): - interface.__init__(self, - self.build_data(), - str(get_shared_data("test_time_events.dat")), - Renewal) + interface.__init__( + self, + self.build_data(), + str(get_shared_data("test_time_events.dat")), + Renewal, + ) def build_data(self): - """todo: check identifier output. should be a list """ + """todo: check identifier output. should be a list""" # build a list of 2 sequences with a variable that should be identical # to sequences1.seq - return TimeEvents(str(get_shared_data('test_time_events.dat'))) + return TimeEvents(str(get_shared_data("test_time_events.dat"))) def test_constructor_negative_binomial(self): proba = 0.5 inf_bound = 0 - param = 1. - Renewal("NEGATIVE_BINOMIAL", inf_bound, param, - proba, Type="Equilibrium", - ObservationTime=40) + param = 1.0 + Renewal( + "NEGATIVE_BINOMIAL", + inf_bound, + param, + proba, + Type="Equilibrium", + ObservationTime=40, + ) def test_constructor_binomial(self): inf_bound = 0 sup_bound = 10 - probability = 1. - Renewal("BINOMIAL", inf_bound, sup_bound, - probability, Type="Equilibrium", - ObservationTime=40) + probability = 1.0 + Renewal( + "BINOMIAL", + inf_bound, + sup_bound, + probability, + Type="Equilibrium", + ObservationTime=40, + ) def test_constructor_poisson(self): inf_bound = 0 probability = 0.5 - param = 1. - Renewal("POISSON", inf_bound, param, - probability, Type="Equilibrium", - ObservationTime=40) + param = 1.0 + Renewal( + "POISSON", + inf_bound, + param, + probability, + Type="Equilibrium", + ObservationTime=40, + ) def test_constructor_scale(self): inf_bound = 0 probability = 0.5 - param = 1. - Renewal("POISSON", inf_bound, param, - probability, Type="Equilibrium", - ObservationTime=40, Scale=0.5) + param = 1.0 + Renewal( + "POISSON", + inf_bound, + param, + probability, + Type="Equilibrium", + ObservationTime=40, + Scale=0.5, + ) def test_constructor_not_implemented(self): try: inf_bound = 0 probability = 0.5 - param = 1. - Renewal("NOT_IMPLEMENTED", inf_bound, param, - probability, Type="Equilibrium", - ObservationTime=40) + param = 1.0 + Renewal( + "NOT_IMPLEMENTED", + inf_bound, + param, + probability, + Type="Equilibrium", + ObservationTime=40, + ) assert False except: @@ -89,23 +124,32 @@ def test_constructor_from_model(self): from openalea.stat_tool.mixture import Mixture from openalea.stat_tool.convolution import Convolution from openalea.stat_tool.distribution import Binomial - Renewal(Compound(Binomial(0,10,0.5), Binomial(0,10,0.3)), - Type="Equilibrium", ObservationTime=20) - Renewal(Mixture(0.1, Binomial(0,10,0.5), 0.9, Binomial(0,10,0.3)), - Type="Equilibrium", ObservationTime=20) - Renewal(Compound(Binomial(0,10,0.5), Binomial(0,10,0.3)), - Type="Equilibrium", ObservationTime=20) + + Renewal( + Compound(Binomial(0, 10, 0.5), Binomial(0, 10, 0.3)), + Type="Equilibrium", + ObservationTime=20, + ) + Renewal( + Mixture(0.1, Binomial(0, 10, 0.5), 0.9, Binomial(0, 10, 0.3)), + Type="Equilibrium", + ObservationTime=20, + ) + Renewal( + Compound(Binomial(0, 10, 0.5), Binomial(0, 10, 0.3)), + Type="Equilibrium", + ObservationTime=20, + ) def test_constructor_not_implemented2(self): try: Renewal(2, 1) - print('here') + print("here") assert False except: assert True - def _test_empty(self): self.empty() @@ -121,7 +165,7 @@ def test_print(self): def test_display(self): self.display() self.display_versus_ascii_write() - #self.display_versus_str() + # self.display_versus_str() def test_len(self): seq = self.data @@ -146,7 +190,7 @@ def test_spreadsheet_write(self): self.spreadsheet_write() def _test_simulate(self): - #self.simulate() + # self.simulate() pass def test_extract(self): @@ -161,7 +205,6 @@ def test_get_htime(self): data = self.data histo = data.get_htime() - def test_get_hnb_event(self): data = self.data histo = data.get_hnb_event(20) @@ -184,17 +227,15 @@ def test_time_scaling(self): mod = TimeScaling(self.data, 2) assert str(aml) == str(mod) - def test_merge(self): time1 = self.data time2 = self.data - assert str(Merge(time1,time2)) == str(time1.merge([time2])) + assert str(Merge(time1, time2)) == str(time1.merge([time2])) def test_time_select(self): - #max value must be greater than the offset. - data= self.data - data.time_select(3,35) - + # max value must be greater than the offset. + data = self.data + data.time_select(3, 35) if __name__ == "__main__": diff --git a/test/test_renewal_functional.py b/test/test_renewal_functional.py index ae2d310..069e126 100644 --- a/test/test_renewal_functional.py +++ b/test/test_renewal_functional.py @@ -15,7 +15,7 @@ """ from openalea.sequence_analysis import * -from tools import runTestClass, robust_path as get_shared_data +from .tools import runTestClass, robust_path as get_shared_data def test1(): diff --git a/test/test_semi_markov.py b/test/test_semi_markov.py index bacf125..6a96c48 100644 --- a/test/test_semi_markov.py +++ b/test/test_semi_markov.py @@ -2,98 +2,83 @@ .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id$" +import pytest -from openalea.stat_tool import _stat_tool -from openalea.sequence_analysis import _sequence_analysis -from openalea.sequence_analysis import * +from openalea.sequence_analysis import SemiMarkov, Simulate -from openalea.stat_tool.data_transform import * -from openalea.stat_tool.cluster import Cluster -from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import robust_path as get_shared_data -def SemiMarkovData(): - sm = SemiMarkov(str(get_shared_data('test_semi_markov.dat'))) - ret = Simulate(sm, 1, 1000, True) - return sm +@pytest.fixture +def interface_instance(): + filename = str(get_shared_data("test_semi_markov.dat")) + return interface( + data=SemiMarkov(filename), + filename=filename, + Structure=SemiMarkov, + ) -class Test(interface): - """a simple unittest class +class TestSemiMarkov: + """a simple unittest class""" - """ - def __init__(self): - interface.__init__(self, - self.build_data(), - str(get_shared_data("test_semi_markov.dat")), - SemiMarkov) + def test_constructor_from_file(self, interface_instance): + interface_instance.constructor_from_file() def build_data(self): - """todo: check identifier output. should be a list """ + """todo: check identifier output. should be a list""" # build a list of 2 sequences with a variable that should be identical # to sequences1.seq - sm = SemiMarkov(str(get_shared_data('test_semi_markov.dat'))) - + return SemiMarkov(str(get_shared_data("test_semi_markov.dat"))) - return sm - - def _test_empty(self): - self.empty() + def test_simulate(self, interface_instance): + Simulate(interface_instance.data, 1, 1000, True) + pass - def test_constructor_from_file(self): - self.constructor_from_file() + def test_empty(self, interface_instance): + interface_instance.empty() - def test_constructor_from_file_failure(self): - self.constructor_from_file_failure() + def test_constructor_from_file_failure(self, interface_instance): + interface_instance.constructor_from_file_failure() - def test_print(self): - self.print_data() + def test_print(self, interface_instance): + interface_instance.print_data() - def test_display(self): - self.display() - self.display_versus_ascii_write() - self.display_versus_str() + def test_display(self, interface_instance): + interface_instance.display() + interface_instance.display_versus_ascii_write() + interface_instance.display_versus_str() - def test_len(self): - seq = self.data + def test_len(self, interface_instance): + seq = interface_instance.data pass - def test_plot(self): - self.plot() + def test_plot(self, interface_instance): + interface_instance.plot() - def test_save(self): - self.save(skip_reading=True) + def test_save(self, interface_instance): + interface_instance.save(skip_reading=True) - def test_plot_write(self): - self.plot_write() + def test_plot_write(self, interface_instance): + interface_instance.plot_write() - def test_file_ascii_write(self): - self.file_ascii_write() + def test_file_ascii_write(self, interface_instance): + interface_instance.file_ascii_write() - def test_spreadsheet_write(self): - self.spreadsheet_write() + def test_spreadsheet_write(self, interface_instance): + interface_instance.spreadsheet_write() - def test_simulate(self): - sm = self.data - sm.simulation_nb_elements(1, 10000, True) - Simulate(sm,1, 10000, True) - pass - - def test_thresholding(self): - self.data.thresholding(1) + def test_thresholding(self, interface_instance): + interface_instance.data.thresholding(1) - def test_extract(self): + def test_extract(self, interface_instance): pass - #self.data.extract(0,1,1) - - def test_extract_data(self): - self.data.extract_data() - + # interface_instance.data.extract(0,1,1) -if __name__ == "__main__": - runTestClass(Test()) + def test_extract_data(self, interface_instance): + interface_instance.data.extract_data() diff --git a/test/test_semi_markov_switching_lm_functional.py b/test/test_semi_markov_switching_lm_functional.py index acf109a..08dc596 100644 --- a/test/test_semi_markov_switching_lm_functional.py +++ b/test/test_semi_markov_switching_lm_functional.py @@ -2,6 +2,7 @@ """tests on mv_mixture""" __version__ = "$Id$" +import openalea.sequence_analysis as sa from openalea.stat_tool import _stat_tool from openalea.sequence_analysis import _sequence_analysis from openalea.sequence_analysis.hidden_semi_markov import HiddenSemiMarkov @@ -12,6 +13,7 @@ from openalea.stat_tool.data_transform import * from openalea.stat_tool.cluster import Cluster from openalea.stat_tool.cluster import Transcode, Cluster +from pathlib import Path import openalea.stat_tool.plot #import DISABLE_PLOT # openalea.stat_tool.plot.DISABLE_PLOT = True @@ -29,16 +31,13 @@ def test1(): - from pathlib import Path - from openalea.sequence_analysis import _MarkovianSequences + _MarkovianSequences = sa._MarkovianSequences - data_path = Path(openalea.sequence_analysis.__path__[0]) - data_path = str(Path.joinpath(data_path.parent.parent.parent.absolute(), "share","data")) - model_file = "switching_lmm_irred.hsc" + model_file = sa.get_shared_data("switching_lmm_irred.hsc") - hsm = HiddenSemiMarkov(data_path + os.sep + model_file) + hsm = HiddenSemiMarkov(str(model_file)) print(hsm.display()) - from openalea.sequence_analysis import Simulate + Simulate = sa.Simulate nb_seq = 30 seq_length = 100 set_seed(0) @@ -51,8 +50,7 @@ def test1(): from openalea.sequence_analysis import Estimate hsmd = hsm.simulation_nb_sequences(nb_seq, seq_length, True) seq_estim = hsmd.select_variable([2], True) - from openalea.stat_tool import NegativeBinomial - d = NegativeBinomial(1, 10, 0.5) + d = sa.NegativeBinomial(1, 10, 0.5) index = [] for u in range(nb_seq): indexut = [] diff --git a/test/test_sequences.py b/test/test_sequences.py index bb49bdb..f25497d 100644 --- a/test/test_sequences.py +++ b/test/test_sequences.py @@ -3,478 +3,547 @@ .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr """ + __revision__ = "$Id$" from openalea.stat_tool import _stat_tool +import pytest from openalea.sequence_analysis import _sequence_analysis from openalea.sequence_analysis.sequences import Sequences, Split, SaveMTG -from openalea.sequence_analysis.data_transform import Cumulate, Difference, \ - ExtractVectors, IndexParameterExtract, IndexParameterSelect, RecurrenceTimeSequences +from openalea.sequence_analysis.data_transform import ( + Cumulate, + Difference, + ExtractVectors, + IndexParameterExtract, + IndexParameterSelect, + RecurrenceTimeSequences, +) from openalea.stat_tool.data_transform import * from openalea.stat_tool.cluster import Cluster from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass +from .tools import interface +from .tools import runTestClass from openalea.sequence_analysis.sequences import Sequences, IndexParameterType -from tools import robust_path as get_shared_data - -class Test(interface): - - def __init__(self): - interface.__init__(self, - self.build_data(), - str(get_shared_data("sequences1.seq")), - Sequences) - self.seqn = self.build_seqn() - self.seqrealn = self.build_seq_realn() - self.seq1 = self.build_seq1() - - def build_data(self): - """todo: check identifier output. should be a list """ - # build a list of 2 sequences with a variable that should be identical - # to sequences1.seq - data = Sequences([ - [1, 0, 0, 0, 1, 1, 2, 0, 2, 2, 2, 1, 1, 0, 1, 0, - 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 2, 2, 2, 1], - [0, 0, 0, 1, 1, 0, 2, 0, 2, 2 ,2 ,1 ,1 ,1 ,1 ,0 ,1 - ,0 ,0 ,0 ,0 ,0]]) - assert data - - assert data.nb_sequence == 2 - assert data.nb_variable == 1 - assert data.cumul_length == 52 - assert data.max_length == 30 - - assert [0, 1] == data.get_identifiers() - - return data - - def build_seqn(self): - s = Sequences([[[1,1,1],[12,12,12]],[[2,2,2],[22,23,24]]]) - return s - - def build_seq1(self): - s = Sequences([[1,1,1],[2,2,2]]) - return s - - def build_seq_realn(self): - s = Sequences([[[1.5,1.5,1.5],[12.5,12.5,12.5]],[[2.5,2.5,2.5],[22.5,23.5,24.5]]]) - return s - - def build_seq_wrong_identifiers(self): - try: - s = Sequences([[1,1,1],[2,2,2]], Identifiers=[-1,1]) - assert False - except: - assert True - - def _test_empty(self): - self.empty() - - def test_constructor_from_file(self): - self.constructor_from_file() - - def test_constructor_from_file_failure(self): - self.constructor_from_file_failure() - - def test_print(self): - self.print_data() - - def test_display(self): - self.display() - self.display_versus_ascii_write() - self.display_versus_str() - - def test_len(self): - seq = self.data - assert len(seq) == 2 - assert len(seq) == seq.nb_sequence - - def test_plot(self): - self.plot() - - def test_save(self): - self.save(skip_reading=True) - - def test_plot_write(self): - self.plot_write() - - def test_file_ascii_write(self): - self.file_ascii_write() - - def test_spreadsheet_write(self): - self.spreadsheet_write() - - def test_extract(self): - #todo - seqn = self.seqn - assert seqn.extract_value(1) - assert seqn.extract_value(2) - - def test_extract_data(self): - pass - - def test_index_parameter_type(self): - - seq1 = Sequences([[1.,1,1],[2.,2,2.]]) - assert IndexParameterType(seq1)=='IMPLICIT_TYPE' - seq1 = Sequences([[1.,1,1],[2.,2,2.]], IndexParameterType="TIME") - assert IndexParameterType(seq1)=='TIME' - seq1 = Sequences([[1.,1,1],[2.,2,2.]],IndexParameterType="POSITION" ) - assert IndexParameterType(seq1)=='POSITION' - - - def test_constructors(self): - # heterogeneous or homogeneous type - seq1 = Sequences([1, 2, 3, 4]) - seq1 = Sequences([1, 2, 3, 4.]) - assert seq1.nb_sequence == 1 - assert seq1.nb_variable == 1 - - # single sequence multivariate - seq2 = Sequences([[1,2],[3,4], [5,6]]) - assert seq2.nb_sequence==1 - assert seq2.nb_variable==2 - #ambiguous case (length>5) - seq2 = Sequences([[1,2,3,4,5,6],[3,4,3,4,5,6], [5,6,4,5,6,7]]) - assert seq2.nb_sequence==3 - assert seq2.nb_variable==1 - - - # univariates sequences - seq3 = Sequences([[1,2],[3,4], [5,6,7]]) - assert seq3.nb_sequence==3 - assert seq3.nb_variable==1 - - # general case - seq4 = Sequences([ [[1,2],[3,4]], [[21,22],[23,24]], [[31,32],[33,34], [35,36] ]]) - assert seq4.nb_sequence==3 - assert seq4.nb_variable==2 - - seq4 = Sequences([ [[1,2],[3,4]], [[21,22],[23,24]], [[31,32],[33,34], [35,36] ]], - VertexIdentifiers=[[1,2],[3,4],[5,6,7]], Identifiers=[1,2,3]) - - seq4 = Sequences([ [[1,2],[3,4]], [[21,22],[23,24]], [[31,32],[33,34], [35,36] ]], - IndexParameterType="POSITION", IndexParameter=[[0,1,10], [2,3,11], [4,5,6,12]]) - - seq4 = Sequences([ [[1,2],[3,4]], [[21,22],[23,24]], [[31,32],[33,34], [35,36] ]], - IndexParameterType="TIME", IndexParameter=[[0,1], [2,3], [4,5,6]]) - - - - - def test_constructor_one_sequence(self): - # two sequences with 2 variables (int) - s = Sequences([[1,1,1],[2,2,2]]) - assert s - # two sequences with 2 variables (real) - s = Sequences([[1.,1.,1.],[2.,2.,2.]]) - assert s - # two sequences with 2 variables mix of (real and int) - # works because the first one is float so all others are assume to be float as well - s = Sequences([[1.,1.,1.],[2.,2.,2]]) - assert s - # here it fails because the first number is int but others may be float - try: - s = Sequences([[1,1.,1.],[2.,2.,2]]) - assert False - except: - assert True - - def test_constructor_two_sequences(self): - # two sequences with 2 variables (int) - s = Sequences([[[1,1,1],[12,12,12]],[[2,2,2],[22,23,24]]]) - assert s - s = Sequences([[[1.,1.,1.],[1.,1.,1.]],[[2.,2.,2.],[2.,2.,2.]]]) - assert s - - def test_container(self): - # first index is the sequence and second index is the variable - s = self.seqn - assert s[0,0] == [1,1,1] - assert s[0,1] == [12,12,12] - assert s[1,0] == [2,2,2] - assert s[1,1] == [22,23,24] - assert s[1,1][1] == 23 - assert len(s) == 2 - - s = self.seq1 - assert s[0,0] == [1,1,1] - assert s[0,1] == [2,2,2] - assert s[0,0][0] == 1 - assert len(s) == 1 - - - - def test_value_select(self): - "test_value_select implemented but need to be checked" - seqn = self.seqn - a = seqn.value_select(1, 1, 2,True) - assert a - assert str(ValueSelect(seqn, 1, 1, 2)) == str(seqn.value_select(1,1,2, True)) - - def test_select_variable_int(self): - "test_select_variable_int implemented but need to be checked (index issue)" - # !!!!!!!! NEED to CHECK THE INDEX 0, 1 , ... or 1,2,.... - # what about identifiers ? - # Variable seems to start at 1 not 0 - s = self.seqn - #select variable 1 - select = s.select_variable([1], keep=True) - assert select[0,0] == [1] - assert select[1,0] == [2] - - def test_select_variable_real(self): - "test_select_variable_real implemented but need to be checked (index issue)" - # !!!!!!!! NEED to CHECK THE INDEX 0, 1 , ... or 1,2,.... - # what about identifiers ? - # Variable seems to start at 1 not 0 - s = self.seqrealn - #select variable 1 - select = s.select_variable([1], keep=True) - assert select[0,0] == [1.5] - assert select[1,0] == [2.5] - - - def test_select_individual(self): - #select one or several sequences - s = self.seqn - - # select all - select = s.select_individual([0,1], keep=True) - assert s.display() == select.markovian_sequences().display() - - #select first sequence only - select = s.select_individual([0], keep=True) - assert select[0,0] == [1, 1, 1] - assert select[0,1] == [12, 12, 12] - try: - select[1,0] - assert False - except: - assert True - - #select second sequence only - select = s.select_individual([1], keep=True) - assert select[0,0] == [2, 2, 2] - assert select[0,1] == [22, 23, 24] - try: - select[1,0] - assert False - except: - assert True - - def test_shift_seqn(self): - s = self.seqn - shifted = s.shift(1,2) - assert shifted[0,0] == [3,1,1] - assert shifted[0,1] == [14,12,12] - assert shifted[1,0] == [4,2,2] - assert shifted[1,1] == [24,23,24] - - - def test_shift_seq1(self): - s = self.seq1 - shifted = s.shift(1,2) - assert shifted[0,0] == [3, 1, 1] - assert shifted[0,1] == [4, 2, 2] - - def test_threshold_seq1(self): - s = self.seqn - thresholded = s.thresholding(1,10,"ABOVE") - for x in thresholded: - for v in x: - assert(v[0] <= 10) - - def test_threshold_seq(self): - s = Sequences([[[1.01,1.07],[2.01,2.07],[1.99,1.07],[2.41,2.07]],[[1.97,1.07],[1.98,2.07],[1.99,1.07],[2.00,2.07]]]) - thresholded = s.thresholding(1,1.99, "ABOVE") - for x in thresholded: - for v in x: - assert(v[0] <= 1.99) - thresholded = s.thresholding(1,1.99, "BELOW") - for x in thresholded: - for v in x: - assert(v[0] >= 1.99) - - assert s - def test_merge (self): - s1 = self.seqn - s2 = self.seqn - s3 = self.seq1 - - sall = s1.merge([s2]) - assert sall.nb_sequence == 4 - assert sall.nb_variable == 3 - - sall = s1.merge([s3]) - assert sall.nb_sequence == 3 - assert sall.nb_variable == 3 - - def test_merge_and_Merge(self): - s1 = self.seqn - s2 = self.seqn - - a = s1.merge([s2]) - b = s2.merge([s1]) - v = Merge(s1, s2) - - assert str(a) == str(b) - assert str(a) == str(v) - - def test_imcompatible_merge(self): - s1 = self.seqn - s3 = self.seq1 - try: - s1.merge(s3) - assert False - except: - assert True - - def test_merge_variable(self): - import copy - s1 = self.seqn - s2 = self.seqn - s3 = self.seq1 - - sall = s1.merge_variable([s2],1) # why 1 ? same result with 2 ! - assert sall.nb_sequence == 2 - assert sall.nb_variable == 6 - - # sall = s1.merge_variable([s3],1) - #assert sall.nb_sequence == 2 - #assert sall.nb_variable == 3 - - def test_merge_variable_and_MergeVariable(self): - s1 = self.seqn - s2 = self.seqn - s3 = self.seq1 - - a = s1.merge_variable([s2],1) - b = s2.merge_variable([s1],1) - v = MergeVariable(s1,s2) - - assert str(a) == str(b) - assert str(a) == str(v) - - - def test_cluster_step(self): - seq1 = Sequences([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) - assert str(Cluster(seq1, "Step", 1, 2)) == str(seq1.cluster_step(1, 2, True)) - seqn = Sequences([[[1, 2, 3], [1, 3, 1]], [[4, 5, 6], [7,8,9]]]) - assert str(Cluster(seqn, "Step", 1, 2)) == str(seqn.cluster_step(1, 2, True)) - - def test_cluster_limit(self): - seq1 = Sequences([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) - assert str(Cluster(seq1, "Limit", 1, [2])) == \ - str(seq1.cluster_limit(1, [2], True)) - seqn = Sequences([[[1, 2, 3], [1, 3, 1]], [[4, 5, 6], [7,8,9]]]) - assert str(Cluster(seqn, "Limit", 1, [2, 4, 6])) == \ - str(seqn.cluster_limit(1, [2, 4 ,6], True)) - - def test_transcode(self): - """This functionality need to be checked. - - See also the vector case!""" - seq = self.seqn - assert str(seq.transcode(1, [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0o1,1,1,1,1,0,0], False))==\ - str(Transcode(seq, 1, [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0o1,1,1,1,1,0,0])) - - def test_reverse(self): - """reverse to be checked. seems to give same output as input""" - s = self.seqn - s.reverse() - - - def test_max_length(self): - s = self.data - assert s.max_length==30 - - def test_get_max_value(self): - s = self.data - assert s.get_max_value(0)==2 - - def test_get_min_value(self): - s = self.data - assert s.get_min_value(0)==0 - - def test_get_length(self): - s = self.data - assert s.get_length(0)==30 - assert s.get_length(1)==22 - - def test_difference(self): - data = self.data - assert str(Difference(data, 1)) == str(data.difference(1, False)) - res = Difference(data, 1) - assert res.cumul_length == 50 - - def test_cumulate(self): - #see also test_cumulate for more tests - s = self.data - res = Cumulate(s) - assert res.cumul_length == 52 - - - def test_extract_vectors(self): - """see test_extract_vectors""" - ExtractVectors(self.data, "Length") - - def _test_index_parameter_extract(self): - """fixme: markovian_sequences should be in wrapper ? """ - aml = self.data.index_parameter_extract(0, 29).markovian_sequences() - mod = IndexParameterExtract(self.data, 0, MaxIndex=29) - assert str(aml) == str(mod) - - - def test_index_parameter_select(self): - """test to be done""" - pass - - def test_recurrence_time_sequences(self): - aml = self.data.recurrence_time_sequences(1, 1) - mod = RecurrenceTimeSequences(self.data, 1, 1) - assert str(aml.markovian_sequences()) == str(mod) - - def test_remove_run(self): - """test to be done""" - pass - def test_transform_position(self): - """test to be done""" - pass - def test_segmentation_extract(self): - """test to be done""" - pass - def test_variable_scaling(self): - """test to be done""" - pass - def test_remove_index_parameter(self): - """test to be done""" - self.data - - - def test_write_mtg(self): - import os - self.data.mtg_write('test.mtg', [1,2]) - os.remove('test.mtg') - - def test_SaveMTG(self): - SaveMTG(self.data,Filename='test.mtg', Type=['N']) - - def test_split(self): - #markovian sequences - data = Sequences(str(get_shared_data('vanille_m.seq'))) - Split(data, 2) - - def test_initial_run(self): - from openalea.sequence_analysis import ComputeInitialRun - #markovian sequences - data = Sequences(str(get_shared_data('vanille_m.seq'))) - ComputeInitialRun(data) +from .tools import robust_path as get_shared_data + + +@pytest.fixture +def build_data(): + """todo: check identifier output. should be a list""" + # build a list of 2 sequences with a variable that should be identical + # to sequences1.seq + data = Sequences( + [ + [ + 1, + 0, + 0, + 0, + 1, + 1, + 2, + 0, + 2, + 2, + 2, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 2, + 2, + 2, + 1, + ], + [0, 0, 0, 1, 1, 0, 2, 0, 2, 2, 2, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0], + ] + ) + assert data + + assert data.nb_sequence == 2 + assert data.nb_variable == 1 + assert data.cumul_length == 52 + assert data.max_length == 30 + + assert [0, 1] == data.get_identifiers() + + return data + + +@pytest.fixture +def build_seqn(): + return Sequences([[[1, 1, 1], [12, 12, 12]], [[2, 2, 2], [22, 23, 24]]]) + + +@pytest.fixture +def build_seq1(): + return Sequences([[1, 1, 1], [2, 2, 2]]) + + +@pytest.fixture +def build_seq_realn(): + return Sequences( + [ + [[1.5, 1.5, 1.5], [12.5, 12.5, 12.5]], + [[2.5, 2.5, 2.5], [22.5, 23.5, 24.5]], + ] + ) + + +def build_seq_wrong_identifiers(): + try: + s = Sequences([[1, 1, 1], [2, 2, 2]], Identifiers=[-1, 1]) + assert False + except: + assert True + + +def test_len(build_data): + seq = build_data + assert len(seq) == 2 + assert len(seq) == seq.nb_sequence + + +def test_extract(build_seqn): + # todo + seqn = build_seqn + assert seqn.extract_value(1) + assert seqn.extract_value(2) + + +def test_index_parameter_type(): + seq1 = Sequences([[1.0, 1, 1], [2.0, 2, 2.0]]) + assert IndexParameterType(seq1) == "IMPLICIT_TYPE" + seq1 = Sequences([[1.0, 1, 1], [2.0, 2, 2.0]], IndexParameterType="TIME") + assert IndexParameterType(seq1) == "TIME" + seq1 = Sequences([[1.0, 1, 1], [2.0, 2, 2.0]], IndexParameterType="POSITION") + assert IndexParameterType(seq1) == "POSITION" + + +def test_constructors(): + # heterogeneous or homogeneous type + seq1 = Sequences([1, 2, 3, 4]) + seq1 = Sequences([1, 2, 3, 4.0]) + assert seq1.nb_sequence == 1 + assert seq1.nb_variable == 1 + + # single sequence multivariate + seq2 = Sequences([[1, 2], [3, 4], [5, 6]]) + assert seq2.nb_sequence == 1 + assert seq2.nb_variable == 2 + # ambiguous case (length>5) + seq2 = Sequences([[1, 2, 3, 4, 5, 6], [3, 4, 3, 4, 5, 6], [5, 6, 4, 5, 6, 7]]) + assert seq2.nb_sequence == 3 + assert seq2.nb_variable == 1 + + # univariates sequences + seq3 = Sequences([[1, 2], [3, 4], [5, 6, 7]]) + assert seq3.nb_sequence == 3 + assert seq3.nb_variable == 1 + + # general case + seq4 = Sequences( + [[[1, 2], [3, 4]], [[21, 22], [23, 24]], [[31, 32], [33, 34], [35, 36]]] + ) + assert seq4.nb_sequence == 3 + assert seq4.nb_variable == 2 + + seq4 = Sequences( + [[[1, 2], [3, 4]], [[21, 22], [23, 24]], [[31, 32], [33, 34], [35, 36]]], + VertexIdentifiers=[[1, 2], [3, 4], [5, 6, 7]], + Identifiers=[1, 2, 3], + ) + + seq4 = Sequences( + [[[1, 2], [3, 4]], [[21, 22], [23, 24]], [[31, 32], [33, 34], [35, 36]]], + IndexParameterType="POSITION", + IndexParameter=[[0, 1, 10], [2, 3, 11], [4, 5, 6, 12]], + ) + + seq4 = Sequences( + [[[1, 2], [3, 4]], [[21, 22], [23, 24]], [[31, 32], [33, 34], [35, 36]]], + IndexParameterType="TIME", + IndexParameter=[[0, 1], [2, 3], [4, 5, 6]], + ) + + +def test_constructor_one_sequence(): + # two sequences with 2 variables (int) + s = Sequences([[1, 1, 1], [2, 2, 2]]) + assert s + # two sequences with 2 variables (real) + s = Sequences([[1.0, 1.0, 1.0], [2.0, 2.0, 2.0]]) + assert s + # two sequences with 2 variables mix of (real and int) + # works because the first one is float so all others are assume to be float as well + s = Sequences([[1.0, 1.0, 1.0], [2.0, 2.0, 2]]) + assert s + # here it fails because the first number is int but others may be float + try: + s = Sequences([[1, 1.0, 1.0], [2.0, 2.0, 2]]) + assert False + except: + assert True + + +def test_constructor_two_sequences(): + # two sequences with 2 variables (int) + s = Sequences([[[1, 1, 1], [12, 12, 12]], [[2, 2, 2], [22, 23, 24]]]) + assert s + s = Sequences( + [[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]], [[2.0, 2.0, 2.0], [2.0, 2.0, 2.0]]] + ) + assert s + + +def test_container(build_seq1, build_seqn): + # first index is the sequence and second index is the variable + s = build_seqn + assert s[0, 0] == [1, 1, 1] + assert s[0, 1] == [12, 12, 12] + assert s[1, 0] == [2, 2, 2] + assert s[1, 1] == [22, 23, 24] + assert s[1, 1][1] == 23 + assert len(s) == 2 + + s = build_seq1 + assert s[0, 0] == [1, 1, 1] + assert s[0, 1] == [2, 2, 2] + assert s[0, 0][0] == 1 + assert len(s) == 1 + + +def test_value_select(build_seqn): + "test_value_select implemented but need to be checked" + seqn = build_seqn + a = seqn.value_select(1, 1, 2, True) + assert a + assert str(ValueSelect(seqn, 1, 1, 2)) == str(seqn.value_select(1, 1, 2, True)) + + +def test_select_variable_int(build_seqn): + "test_select_variable_int implemented but need to be checked (index issue)" + # !!!!!!!! NEED to CHECK THE INDEX 0, 1 , ... or 1,2,.... + # what about identifiers ? + # Variable seems to start at 1 not 0 + s = build_seqn + # select variable 1 + select = s.select_variable([1], keep=True) + assert select[0, 0] == [1] + assert select[1, 0] == [2] + + +def test_select_variable_real(build_seq_realn): + "test_select_variable_real implemented but need to be checked (index issue)" + # !!!!!!!! NEED to CHECK THE INDEX 0, 1 , ... or 1,2,.... + # what about identifiers ? + # Variable seems to start at 1 not 0 + s = build_seq_realn + # select variable 1 + select = s.select_variable([1], keep=True) + assert select[0, 0] == [1.5] + assert select[1, 0] == [2.5] + + +def test_select_individual(build_seqn): + # select one or several sequences + s = build_seqn + + # select all + select = s.select_individual([0, 1], keep=True) + assert s.display() == select.markovian_sequences().display() + + # select first sequence only + select = s.select_individual([0], keep=True) + assert select[0, 0] == [1, 1, 1] + assert select[0, 1] == [12, 12, 12] + try: + select[1, 0] + assert False + except: + assert True + + # select second sequence only + select = s.select_individual([1], keep=True) + assert select[0, 0] == [2, 2, 2] + assert select[0, 1] == [22, 23, 24] + try: + select[1, 0] + assert False + except: + assert True + + +def test_shift_seqn(build_seqn): + s = build_seqn + shifted = s.shift(1, 2) + assert shifted[0, 0] == [3, 1, 1] + assert shifted[0, 1] == [14, 12, 12] + assert shifted[1, 0] == [4, 2, 2] + assert shifted[1, 1] == [24, 23, 24] + + +def test_shift_seq1(build_seq1): + s = build_seq1 + shifted = s.shift(1, 2) + assert shifted[0, 0] == [3, 1, 1] + assert shifted[0, 1] == [4, 2, 2] + + +def test_threshold_seq1(build_seqn): + s = build_seqn + thresholded = s.thresholding(1, 10, "ABOVE") + for x in thresholded: + for v in x: + assert v[0] <= 10 + + +def test_threshold_seq(): + s = Sequences( + [ + [[1.01, 1.07], [2.01, 2.07], [1.99, 1.07], [2.41, 2.07]], + [[1.97, 1.07], [1.98, 2.07], [1.99, 1.07], [2.00, 2.07]], + ] + ) + thresholded = s.thresholding(1, 1.99, "ABOVE") + for x in thresholded: + for v in x: + assert v[0] <= 1.99 + thresholded = s.thresholding(1, 1.99, "BELOW") + for x in thresholded: + for v in x: + assert v[0] >= 1.99 + + assert s + + +def test_merge(build_seqn, build_seq1): + s1 = build_seqn + s2 = build_seqn + s3 = build_seq1 + + sall = s1.merge([s2]) + assert sall.nb_sequence == 4 + assert sall.nb_variable == 3 + + sall = s1.merge([s3]) + assert sall.nb_sequence == 3 + assert sall.nb_variable == 3 + + +def test_merge_and_Merge(build_seqn): + s1 = build_seqn + s2 = build_seqn + + a = s1.merge([s2]) + b = s2.merge([s1]) + v = Merge(s1, s2) + + assert str(a) == str(b) + assert str(a) == str(v) + + +def test_imcompatible_merge(build_seqn, build_seq1): + s1 = build_seqn + s3 = build_seq1 + try: + s1.merge(s3) + assert False + except: + assert True + + +def test_merge_variable(build_seqn, build_seq1): + s1 = build_seqn + s2 = build_seqn + s3 = build_seq1 + + sall = s1.merge_variable([s2], 1) # why 1 ? same result with 2 ! + assert sall.nb_sequence == 2 + assert sall.nb_variable == 6 + + # sall = s1.merge_variable([s3],1) + # assert sall.nb_sequence == 2 + # assert sall.nb_variable == 3 + + +def test_merge_variable_and_MergeVariable(build_seqn, build_seq1): + s1 = build_seqn + s2 = build_seqn + s3 = build_seq1 + + a = s1.merge_variable([s2], 1) + b = s2.merge_variable([s1], 1) + v = MergeVariable(s1, s2) + + assert str(a) == str(b) + assert str(a) == str(v) + + +def test_cluster_step(): + seq1 = Sequences([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) + assert str(Cluster(seq1, "Step", 1, 2)) == str(seq1.cluster_step(1, 2, True)) + seqn = Sequences([[[1, 2, 3], [1, 3, 1]], [[4, 5, 6], [7, 8, 9]]]) + assert str(Cluster(seqn, "Step", 1, 2)) == str(seqn.cluster_step(1, 2, True)) + + +def test_cluster_limit(): + seq1 = Sequences([[1, 2, 3], [1, 3, 1], [4, 5, 6]]) + assert str(Cluster(seq1, "Limit", 1, [2])) == str(seq1.cluster_limit(1, [2], True)) + seqn = Sequences([[[1, 2, 3], [1, 3, 1]], [[4, 5, 6], [7, 8, 9]]]) + assert str(Cluster(seqn, "Limit", 1, [2, 4, 6])) == str( + seqn.cluster_limit(1, [2, 4, 6], True) + ) + + +def test_transcode(build_seqn): + """This functionality need to be checked. + + See also the vector case!""" + seq = build_seqn + assert str( + seq.transcode( + 1, + [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0o1, 1, 1, 1, 1, 0, 0], + False, + ) + ) == str( + Transcode( + seq, + 1, + [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0o1, 1, 1, 1, 1, 0, 0], + ) + ) + + +def test_reverse(build_seqn): + """reverse to be checked. seems to give same output as input""" + s = build_seqn + s.reverse() + + +def test_max_length(build_data): + s = build_data + assert s.max_length == 30 + + +def test_get_max_value(build_data): + s = build_data + assert s.get_max_value(0) == 2 + + +def test_get_min_value(build_data): + s = build_data + assert s.get_min_value(0) == 0 + + +def test_get_length(build_data): + s = build_data + assert s.get_length(0) == 30 + assert s.get_length(1) == 22 + + +def test_difference(build_data): + data = build_data + assert str(Difference(data, 1)) == str(data.difference(1, False)) + res = Difference(data, 1) + assert res.cumul_length == 50 + + +def test_cumulate(build_data): + # see also test_cumulate for more tests + s = build_data + res = Cumulate(s) + assert res.cumul_length == 52 + + +def test_extract_vectors(build_data): + """see test_extract_vectors""" + ExtractVectors(build_data, "Length") + + +def _test_index_parameter_extract(build_data): + """fixme: markovian_sequences should be in wrapper ?""" + aml = build_data.index_parameter_extract(0, 29).markovian_sequences() + mod = IndexParameterExtract(build_data, 0, MaxIndex=29) + assert str(aml) == str(mod) + + +def test_index_parameter_select(): + """test to be done""" + pass + + +def test_recurrence_time_sequences(build_data): + aml = build_data.recurrence_time_sequences(1, 1) + mod = RecurrenceTimeSequences(build_data, 1, 1) + assert str(aml.markovian_sequences()) == str(mod) + + +def test_remove_run(): + """test to be done""" + pass + + +def test_transform_position(): + """test to be done""" + pass + + +def test_segmentation_extract(): + """test to be done""" + pass + + +def test_variable_scaling(): + """test to be done""" + pass + + +def test_remove_index_parameter(): + """test to be done""" + pass + + +def test_write_mtg(build_data): + import os + + build_data.mtg_write("test.mtg", [1, 2]) + os.remove("test.mtg") + + +def test_SaveMTG(build_data): + SaveMTG(build_data, Filename="test.mtg", Type=["N"]) + + +def test_split(): + # markovian sequences + data = Sequences(str(get_shared_data("vanille_m.seq"))) + Split(data, 2) + + +def test_initial_run(): + from openalea.sequence_analysis import ComputeInitialRun + + # markovian sequences + data = Sequences(str(get_shared_data("vanille_m.seq"))) + ComputeInitialRun(data) + """ @@ -486,6 +555,3 @@ def test_initial_run(self): seq.remove_index_parameter seq.round """ - -if __name__ == "__main__": - runTestClass(Test()) diff --git a/test/test_time_events.py b/test/test_time_events.py index 697c377..eee6567 100644 --- a/test/test_time_events.py +++ b/test/test_time_events.py @@ -15,8 +15,8 @@ from openalea.stat_tool.cluster import Cluster from openalea.stat_tool.cluster import Transcode, Cluster -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import runTestClass, robust_path as get_shared_data def TimeEventsData(): diff --git a/test/test_top_parameters.py b/test/test_top_parameters.py index 0b6a2d7..848f96d 100644 --- a/test/test_top_parameters.py +++ b/test/test_top_parameters.py @@ -17,8 +17,8 @@ -from tools import interface -from tools import runTestClass +from .tools import interface +from .tools import runTestClass def TopParametersData(): diff --git a/test/test_tops.py b/test/test_tops.py index 885ee96..5cd10b5 100644 --- a/test/test_tops.py +++ b/test/test_tops.py @@ -1,17 +1,18 @@ -""" Test tops data structure +"""Test tops data structure .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo:: to be done """ + __revision__ = "$Id$" from openalea.stat_tool import _stat_tool from openalea.sequence_analysis import _sequence_analysis from openalea.sequence_analysis import * -from tools import interface -from tools import runTestClass, robust_path as get_shared_data +from .tools import interface +from .tools import runTestClass, robust_path as get_shared_data def TopsData(): @@ -22,19 +23,15 @@ def TopsData(): class Test(interface): - """a simple unittest class - + """a simple unittest class""" - """ def __init__(self): - interface.__init__(self, - self.build_data(), - str(get_shared_data("test_tops1.dat")), - Tops) + interface.__init__( + self, self.build_data(), str(get_shared_data("test_tops1.dat")), Tops + ) def build_data(self): - - return Tops(str(get_shared_data('test_tops1.dat'))) + return Tops(str(get_shared_data("test_tops1.dat"))) def _test_empty(self): self.empty() @@ -52,15 +49,15 @@ def _test_constructor_arrayn(self): pass def _test_constructor_array1(self): - #print '--------------' - #top = Tops([1,2,3,4,5], Identifiers=[1]) - print('------------') - #print type(top) - print('---------') + # print '--------------' + # top = Tops([1,2,3,4,5], Identifiers=[1]) + print("------------") + # print type(top) + print("---------") print(top) - #print self.data - #top = Tops('data/tops1.dat') - #print top + # print self.data + # top = Tops('data/tops1.dat') + # print top def test_print(self): self.print_data() diff --git a/test/test_transcode.py b/test/test_transcode.py index 36bd49c..202cb27 100644 --- a/test/test_transcode.py +++ b/test/test_transcode.py @@ -1,9 +1,10 @@ -""" Test on transcode +"""Test on transcode .. author:: Thomas Cokelaer, Thomas.Cokelaer@inria.fr .. todo:: to be done """ + __revision__ = "$Id$" @@ -21,8 +22,3 @@ def test_transcode_semi_markov(): """test to be done""" pass -if __name__ == "__main__": - test_transcode_vectors() - test_transcode_sequences() - test_transcode_semi_markov() - \ No newline at end of file diff --git a/test/tools.py b/test/tools.py index 36f45a0..167cb86 100644 --- a/test/tools.py +++ b/test/tools.py @@ -6,7 +6,8 @@ from openalea.stat_tool import Simulate from openalea.stat_tool.plot import DISABLE_PLOT from openalea.stat_tool.output import Display, Save -DISABLE_PLOT=True + +DISABLE_PLOT = True from pathlib import Path from openalea.sequence_analysis import get_shared_data, get_shared_data_path @@ -23,12 +24,14 @@ __revision__ = "$Id$" + def runTestClass(myclass): - functions = [x for x in dir(myclass) if x.startswith('test')] + functions = [x for x in dir(myclass) if x.startswith("test")] for function in functions: getattr(myclass, function)() -class interface(): + +class interface: """Interface to be used by test file that perform tests on the following data structure: compound, convolution, mixture, histogram, vector @@ -39,7 +42,7 @@ class interface(): :Usage: In you test file, add :: - >>> from tools import interface + >>> from .tools import interface Then, if we consider the Compound class case, create a class as follows:: @@ -59,11 +62,12 @@ def test_empty(self): self.empty() """ - def __init__(self, data=None, filename=None, Structure=None): - self.data = data - self.filename = filename - self.structure = Structure - set_seed(0) + + # def __init__(self, data=None, filename=None, Structure=None): + # self.data = data + # self.filename = filename + # self.structure = Structure + # set_seed(0) def build_data(self): raise NotImplementedError() @@ -102,7 +106,7 @@ def display(self): data = self.data data.display() Display(data) - assert data.display()==Display(data) + assert data.display() == Display(data) def display_versus_ascii_write(self): """check that display is equivalent to ascii_write""" @@ -115,7 +119,7 @@ def display_versus_str(self): assert Display(data) == s def plot(self): - """run plotting routines """ + """run plotting routines""" if DISABLE_PLOT == False: self.data.plot() @@ -126,57 +130,56 @@ def save(self, Format=None, skip_reading=False): .. todo:: This is surely a bug. to be checked""" - c1 = self.data try: - os.remove('test1.dat') + os.remove("test1.dat") except: pass try: - os.remove('test2.dat') + os.remove("test2.dat") except: pass if Format is None: - c1.save('test1.dat') - Save(c1, 'test2.dat') + c1.save("test1.dat") + Save(c1, "test2.dat") else: - c1.save('test1.dat', Format="Data") - Save(c1, 'test2.dat', Format="Data") + c1.save("test1.dat", Format="Data") + Save(c1, "test2.dat", Format="Data") if skip_reading: pass else: - c1_read = self.structure('test1.dat') - c2_read = self.structure('test2.dat') + c1_read = self.structure("test1.dat") + c2_read = self.structure("test2.dat") print(c1_read) assert c1 and c1_read and c2_read assert str(c1_read) == str(c2_read) - #os.remove('test1.dat') - #os.remove('test2.dat') + # os.remove('test1.dat') + # os.remove('test2.dat') def plot_write(self): h = self.data - h.plot_write('test', 'title') + h.plot_write("test", "title") def file_ascii_write(self): h = self.data - h.file_ascii_write('test.dat', True) - os.remove('test.dat') + h.file_ascii_write("test.dat", True) + os.remove("test.dat") def file_ascii_data_write(self): h = self.data - h.file_ascii_data_write('test.dat', True) - os.remove('test.dat') + h.file_ascii_data_write("test.dat", True) + os.remove("test.dat") def spreadsheet_write(self): h = self.data - h.spreadsheet_write('test.dat') - os.remove('test.dat') + h.spreadsheet_write("test.dat") + os.remove("test.dat") def survival_ascii_write(self): d = self.data @@ -184,7 +187,7 @@ def survival_ascii_write(self): def survival_plot_write(self): d = self.data - d.survival_plot_write('test','test') + d.survival_plot_write("test", "test") def survival_file_ascii_write(self): d = self.data @@ -192,8 +195,8 @@ def survival_file_ascii_write(self): def survival_spreadsheet_write(self): d = self.data - d.survival_spreadsheet_write('test.xsl') - os.remove('test.xsl') + d.survival_spreadsheet_write("test.xsl") + os.remove("test.xsl") def simulate(self): """Test the simulate method""" @@ -217,14 +220,5 @@ def test_extract_data(self): def robust_path(filename): - p = get_shared_data_path(sa) - if p is not None: - # module in develop mode? - return get_shared_data(filename) - - p = Path(sa.__path__[0]) - if 'src' in str(p): - root_pkg = p/'../../..' - data = get_shared_data_path(root_pkg) - return os.path.join(data,filename) - + p = get_shared_data(filename) + return p diff --git a/tutorials/hidden_semi_markov.ipynb b/tutorials/hidden_semi_markov.ipynb index a5b33db..df6758b 100644 --- a/tutorials/hidden_semi_markov.ipynb +++ b/tutorials/hidden_semi_markov.ipynb @@ -89,14 +89,15 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'2.0.1'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" + "ename": "ModuleNotFoundError", + "evalue": "No module named 'xlrd'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mxlrd\u001b[39;00m\n\u001b[32m 2\u001b[39m xlrd.__version__\n", + "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'xlrd'" + ] } ], "source": [ @@ -131,7 +132,31 @@ "cell_type": "code", "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'rpy2'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mget_ipython\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_line_magic\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mload_ext\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mrpy2.ipython\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/statdev/lib/python3.13/site-packages/IPython/core/interactiveshell.py:2504\u001b[39m, in \u001b[36mInteractiveShell.run_line_magic\u001b[39m\u001b[34m(self, magic_name, line, _stack_depth)\u001b[39m\n\u001b[32m 2502\u001b[39m kwargs[\u001b[33m'\u001b[39m\u001b[33mlocal_ns\u001b[39m\u001b[33m'\u001b[39m] = \u001b[38;5;28mself\u001b[39m.get_local_scope(stack_depth)\n\u001b[32m 2503\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m.builtin_trap:\n\u001b[32m-> \u001b[39m\u001b[32m2504\u001b[39m result = \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2506\u001b[39m \u001b[38;5;66;03m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[32m 2507\u001b[39m \u001b[38;5;66;03m# when using magics with decorator @output_can_be_silenced\u001b[39;00m\n\u001b[32m 2508\u001b[39m \u001b[38;5;66;03m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[32m 2509\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[38;5;28;01mFalse\u001b[39;00m):\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/statdev/lib/python3.13/site-packages/IPython/core/magics/extension.py:33\u001b[39m, in \u001b[36mExtensionMagics.load_ext\u001b[39m\u001b[34m(self, module_str)\u001b[39m\n\u001b[32m 31\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m module_str:\n\u001b[32m 32\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m UsageError(\u001b[33m'\u001b[39m\u001b[33mMissing module name.\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m33\u001b[39m res = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mshell\u001b[49m\u001b[43m.\u001b[49m\u001b[43mextension_manager\u001b[49m\u001b[43m.\u001b[49m\u001b[43mload_extension\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodule_str\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 35\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m res == \u001b[33m'\u001b[39m\u001b[33malready loaded\u001b[39m\u001b[33m'\u001b[39m:\n\u001b[32m 36\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mThe \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m extension is already loaded. To reload it, use:\u001b[39m\u001b[33m\"\u001b[39m % module_str)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/statdev/lib/python3.13/site-packages/IPython/core/extensions.py:62\u001b[39m, in \u001b[36mExtensionManager.load_extension\u001b[39m\u001b[34m(self, module_str)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Load an IPython extension by its module name.\u001b[39;00m\n\u001b[32m 56\u001b[39m \n\u001b[32m 57\u001b[39m \u001b[33;03mReturns the string \"already loaded\" if the extension is already loaded,\u001b[39;00m\n\u001b[32m 58\u001b[39m \u001b[33;03m\"no load function\" if the module doesn't have a load_ipython_extension\u001b[39;00m\n\u001b[32m 59\u001b[39m \u001b[33;03mfunction, or None if it succeeded.\u001b[39;00m\n\u001b[32m 60\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 61\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m62\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_load_extension\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodule_str\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 63\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mModuleNotFoundError\u001b[39;00m:\n\u001b[32m 64\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m module_str \u001b[38;5;129;01min\u001b[39;00m BUILTINS_EXTS:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/statdev/lib/python3.13/site-packages/IPython/core/extensions.py:77\u001b[39m, in \u001b[36mExtensionManager._load_extension\u001b[39m\u001b[34m(self, module_str)\u001b[39m\n\u001b[32m 75\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m.shell.builtin_trap:\n\u001b[32m 76\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m module_str \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m sys.modules:\n\u001b[32m---> \u001b[39m\u001b[32m77\u001b[39m mod = \u001b[43mimport_module\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodule_str\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 78\u001b[39m mod = sys.modules[module_str]\n\u001b[32m 79\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._call_load_ipython_extension(mod):\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/statdev/lib/python3.13/importlib/__init__.py:88\u001b[39m, in \u001b[36mimport_module\u001b[39m\u001b[34m(name, package)\u001b[39m\n\u001b[32m 86\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[32m 87\u001b[39m level += \u001b[32m1\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_bootstrap\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_gcd_import\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m[\u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpackage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1387\u001b[39m, in \u001b[36m_gcd_import\u001b[39m\u001b[34m(name, package, level)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1360\u001b[39m, in \u001b[36m_find_and_load\u001b[39m\u001b[34m(name, import_)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1310\u001b[39m, in \u001b[36m_find_and_load_unlocked\u001b[39m\u001b[34m(name, import_)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:488\u001b[39m, in \u001b[36m_call_with_frames_removed\u001b[39m\u001b[34m(f, *args, **kwds)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1387\u001b[39m, in \u001b[36m_gcd_import\u001b[39m\u001b[34m(name, package, level)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1360\u001b[39m, in \u001b[36m_find_and_load\u001b[39m\u001b[34m(name, import_)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:1324\u001b[39m, in \u001b[36m_find_and_load_unlocked\u001b[39m\u001b[34m(name, import_)\u001b[39m\n", + "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'rpy2'" + ] + } + ], "source": [ "%load_ext rpy2.ipython" ] @@ -182,17 +207,14 @@ { "data": { "text/plain": [ - "['/home/jdurand/devlp/Git/openalea/StructureAnalysis',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python310.zip',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python3.10',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python3.10/lib-dynload',\n", + "['/home/jdurand/usr/local/openalea',\n", + " '/home/jdurand/miniforge3/envs/statdev/lib/python313.zip',\n", + " '/home/jdurand/miniforge3/envs/statdev/lib/python3.13',\n", + " '/home/jdurand/miniforge3/envs/statdev/lib/python3.13/lib-dynload',\n", " '',\n", - " '/home/jdurand/.local/lib/python3.10/site-packages',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python3.10/site-packages',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python3.10/site-packages/OpenAlea.SConsX-2.4.0-py3.9.egg',\n", - " '/home/jdurand/devlp/Git/openalea/StructureAnalysis/stat_tool/src',\n", - " '/home/jdurand/devlp/Git/openalea/StructureAnalysis/sequence_analysis/src',\n", - " '/home/jdurand/miniforge3/envs/openalea/lib/python3.10/site-packages/openalea.deploy-3.1.2-py3.10.egg']" + " '/home/jdurand/miniforge3/envs/statdev/lib/python3.13/site-packages',\n", + " '/home/jdurand/devlp/Git/openalea/StructureAnalysis/sequence_analysis/src/openalea',\n", + " '/home/jdurand/devlp/Git/openalea/StructureAnalysis/stat_tool/src/openalea']" ] }, "execution_count": 9, @@ -250,7 +272,84 @@ "cell_type": "code", "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 \n", + "3 8 STATES\n", + "4 \n", + "5 INITIAL_PROBABILITIES\n", + "6 0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.0\n", + "7 \n", + "8 TRANSITION_PROBABILITIES\n", + "9 0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0\n", + "10 0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0\n", + "11 0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0\n", + "12 0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0\n", + "13 0.0 0.0 0.0 0.0 0.0 0.4 0.3 0.3\n", + "14 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5\n", + "15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0\n", + "16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0\n", + "19 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "22 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "25 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "28 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "31 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "34 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "37 NEGATIVE_BINOMIAL INF_BOUND : 1 PARAMETER : 1 PROBABILITY : 0.05\n", + "42 \n", + "43 STATE 0 OBSERVATION_DISTRIBUTION\n", + "44 OUTPUT 0 : 1.0\n", + "45 \n", + "46 STATE 1 OBSERVATION_DISTRIBUTION\n", + "47 OUTPUT 0 : 0.2\n", + "48 OUTPUT 1 : 0.1\n", + "49 OUTPUT 2 : 0.3\n", + "50 OUTPUT 3 : 0.2\n", + "51 OUTPUT 4 : 0.2\n", + "52 \n", + "53 STATE 2 OBSERVATION_DISTRIBUTION\n", + "54 OUTPUT 0 : 0.2\n", + "55 OUTPUT 1 : 0.3\n", + "56 OUTPUT 2 : 0.2\n", + "57 OUTPUT 3 : 0.1\n", + "58 OUTPUT 4 : 0.2\n", + "59 \n", + "60 STATE 3 OBSERVATION_DISTRIBUTION\n", + "61 OUTPUT 0 : 0.2\n", + "62 OUTPUT 1 : 0.2\n", + "63 OUTPUT 2 : 0.2\n", + "64 OUTPUT 3 : 0.3\n", + "65 OUTPUT 4 : 0.1\n", + "66 \n", + "67 STATE 4 OBSERVATION_DISTRIBUTION\n", + "68 OUTPUT 0 : 0.2\n", + "69 OUTPUT 1 : 0.2\n", + "70 OUTPUT 2 : 0.2\n", + "71 OUTPUT 3 : 0.1\n", + "72 OUTPUT 4 : 0.3\n", + "73 \n", + "74 STATE 5 OBSERVATION_DISTRIBUTION\n", + "75 OUTPUT 0 : 0.3\n", + "76 OUTPUT 1 : 0.2\n", + "77 OUTPUT 2 : 0.1\n", + "78 OUTPUT 3 : 0.2\n", + "79 OUTPUT 4 : 0.2\n", + "80 \n", + "81 STATE 6 OBSERVATION_DISTRIBUTION\n", + "82 OUTPUT 0 : 0.2\n", + "83 OUTPUT 1 : 0.2\n", + "84 OUTPUT 2 : 0.3\n", + "85 OUTPUT 3 : 0.2\n", + "86 OUTPUT 4 : 0.1\n", + "87 \n", + "88 STATE 7 OBSERVATION_DISTRIBUTION\n", + "89 OUTPUT 0 : 1.0\n" + ] + } + ], "source": [ "model_file = \"test_hidden_semi_markov.dat\"\n", "\n", @@ -284,7 +383,7 @@ "outputs": [ { "data": { - "image/png": "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AEATFBgYqKuvvloff/yxzpw5Yy53OBz65z//qQ4dOuiKK66QJHOms127drm08emnn1Zo19fX16W9833wwQcyDMN8f/DgQW3evNlllrXo6Gjt3bvXZRaz48ePa/PmzRWOJana49W1hqpcd911ysvL0yeffOKy/N133zXXS9JNN90kSXr99derbGv06NHy8vLS/v37NWDAgEoflbniiiv09NNPq2fPntq+fXuF9Z6enrr66qu1aNEiSap0GwDAhaNHBwCaqOeff17XX3+9Ro4cqccee0w+Pj567bXX9L///U8ffPCB2WNx8803q1WrVvrVr36l2bNny8vLS4sXL9ahQ4cqtNmzZ0/9+9//1pIlS9S5c2f5+fmpZ8+e5vqsrCzdfvvtuv/++5WTk6NZs2bJz89PTz75pLnNL3/5S7355pu65557dP/99+v48eN68cUXKwwja9GihaKiovSf//xH1113nVq1aqU2bdqYwawq7tRQlcmTJ2vRokWaMmWKUlNT1bNnT23cuFF//vOfdfPNN2vUqFGSnL0rv/zlL/Xss8/q6NGj+vnPfy5fX1/t2LFDAQEBeuihhxQdHa3Zs2frqaee0oEDB3TjjTeqZcuWOnr0qL777jsFBgYqLi5Ou3bt0u9//3v94he/0OWXXy4fHx999dVX2rVrl2bOnClJeuONN/TVV19pzJgx6tixowoKCvTOO+9IkllTVY4dO6b169dLkr7//ntJzmuM2rZtq7Zt2yomJqbG7wUALkmNOxcCAKA6GzZsMK699lojMDDQ8Pf3NwYPHmx8+umnFbb77rvvjKFDhxqBgYFG+/btjVmzZhlvv/12hRm6UlNTjRtuuMFo0aKFIcmcJa1sxrP33nvPmDZtmtG2bVvD19fXGD58uLFt27YKx/vHP/5hdO3a1fDz8zO6detmLFmypMKsa4ZhGGvXrjX69u1r+Pr6GpKMKVOmVPlZa1PDlClTjMDAwErbOX78uPHggw8a4eHhhpeXlxEVFWU8+eSTRkFBgct2paWlxiuvvGL06NHD8PHxMYKDg40hQ4ZU+H4/+eQTY+TIkYbdbjd8fX2NqKgo48477zTWrl1rGIZhHD161Jg6dapx1VVXGYGBgUZQUJDRq1cv45VXXjFKSkoMwzCMb775xrj99tuNqKgow9fX12jdurURExNjrFixosrv4/zvpbJHZbPf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wEANGDBAW7ZskSTt379ft912m0JDQxUUFKSBAwdqbS2DpcPh0OzZs9WhQwf5+vqqT58+WrVqlbm+sh6VxMRE83uOj4/Xvffeq5ycHPOzxMbGSnIOm5szZ44mTZqkoKAgRURE6NVXXzXbSU1Nlc1mU2Jiorns5MmTstlsio+PV2pqqkaOHClJatmypWw2m6ZOnVrp5wgMDNTrr7+u+++/X2FhYbX6Di4EQQcAAOBS8sUX0tatztdbtzrfN5CFCxdqyJAhuv/++5WRkaGMjAxFRkaa65966inNnz9f27Ztk5eXl+677z5z3erVq3XPPfdo2rRpSkpK0ptvvqnFixfrueeekyQZhqGxY8fqxIkTWr9+vdasWaP9+/drwoQJLjXs27dPH374oZYtW2aetI8ZM0aZmZn6/PPPlZCQoH79+um6667TiRMnNGHCBD366KPq3r27WfP5bUpSXl6eYmJilJ6erhUrVmjnzp164okn5HA4zPU333yz1q5dqx07dmj06NG65ZZblJaWVqvvb/78+Zo3b5527dql0aNH69Zbb9WPP/7o1v5Dhw7VggULZLfbzc/y2GOPmetfeukl9erVS9u3b9eTTz6phx9+WGvWrHGr7cjISC1btkySlJycrIyMDC1cuNDtz3YxeDV2AQAAAKij/Hzphx/c394wpEcekTw8JIfD+fzII9K770o2m/vtXHWVFBBQ42bBwcHy8fFRQEBApb/kP/fcc4qJiZEkzZw5U2PGjFFBQYH8/Pz03HPPaebMmZoyZYokqXPnzpozZ46eeOIJzZo1S2vXrtWuXbuUkpJihqf33ntP3bt319atWzVw4EBJUlFRkd577z21bdtWkvTVV1/p+++/V1ZWljkMbd68efrkk0/00Ucf6YEHHlBQUJC8vLyq7X3417/+pWPHjmnr1q1q1aqVJKlLly7m+t69e6t3797m+2effVbLly/XihUr9Pvf/77G766srj/84Q+aOHGiJGnu3Llat26dFixYoEWLFtW4v4+Pj4KDg2Wz2Sr9LMOGDdPMmTMlSVdccYU2bdqkV155Rddff32NbXt6epqfu127dg12HdCFIOgAAAA0Vz/8IPXvX/f9HQ4pKUkaMKB2+yUkSP361f24Z/Xq1ct8HR4eLknKyspSx44dlZCQoK1bt5o9OJLzWo+CggLl5+drz549ioyMdOkh6tat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fn1g6BoAAEAzlZ+frx9++KHG7fbs2eNWe+5ud9VVVykgIKDG7YKDg+Xj46OAgIBKh30999xziomJkSTNnDlTY8aMUUFBgfz8/PTcc89p5syZmjJliiSpc+fOmjNnjp544gnNmjVLa9eu1a5du5SSkmKGp/fee0/du3fX1q1bNXDgQElSUVGR3nvvPbVt21aS84T7+++/V1ZWlnx9fSVJ8+bN0yeffKKPPvpIDzzwgIKCguTl5VXtULV//etfOnbsmLZu3apWrVpJkrp06WKu7927t3r37m2+f/bZZ7V8+XKtWLFCv//972v87srq+sMf/qCJEydKkubOnat169ZpwYIFbgUGHx8fBQcHy2azVfpZhg0bppkzZ0qSrrjiCm3atEmvvPKKrr/++hrb9vT0ND93u3btqr1G5/jx45o6dar++c9/ym6319h2fSHoAAAANFM//PCD+vfvX2/t3XPPPW5tV9YLcqF69eplvg4PD5ckZWVlqWPHjkpISNDWrVvNHhxJKi0tVUFBgfLz87Vnzx5FRka69BB169ZNISEh2rNnjxl0oqKizJBTVnteXp5at27tUsuZM2e0f/9+t2tPTExU3759zZP9850+fVpxcXFauXKl0tPTVVJSojNnzrjdo5Obm6v09HQNGzbMZfmwYcPMYXYXasiQIRXeN8SkEffff78mTZqka665pt7brg5BBwAAoJm66qqrlJCQUON2e/bscSvE/POf/1TXrl3dOm59KD8xgM1mkyRz6JfD4VBcXJzuuOOOCvv5+fnJMAxzn/LOXx4YGOiy3uFwKDw8XPHx8RX2dXfmMEny9/evdv3jjz+u1atXa968eerSpYv8/f115513qqioyO1jSKrwGct/Pg8PD3NZmeLi4lq1X9Xx6rPtr776SitWrNC8efPMNh0Oh7y8vPTWW2+5DFmsTwQdAACAZiogIKBeelbKdO3atV7bk5zDp0pLS2u9X79+/ZScnOwyHKy8bt26KS0tTYcOHTJ7dZKSkpSTk1NtWOvXr58yMzPl5eWl6OjoOtfcq1cvvf322zpx4kSlvTobNmzQ1KlTdfvtt0tyXrNTfiKGmtjtdkVERGjjxo0uPSGbN2/WoEGDJMnsqSo/7fX5U2JX91m+/fbbCu/LQmz5tvv27Vtl25Jq/K6++eYbl23+85//aO7cudq8ebPat29f7b4XgskIAAAA0GCio6O1ZcsWpaamKjs72+yxqckzzzyjd999V7Gxsdq9e7f27NmjJUuW6Omnn5YkjRo1Sr169dLdd9+t7du367vvvtPkyZMVExOjAQMGVNnuqFGjNGTIEI0dO1arV69WamqqNm/erKefflrbtm0za05JSVFiYqKys7NVWFhYoZ277rpLYWFhGjt2rDZt2qQDBw5o2bJl+uabbyQ5r9f5+OOPlZiYqJ07d2rSpEluf/Yyjz/+uObOnaslS5YoOTlZM2fOVGJioqZPn24eIzIyUrGxsdq7d68+++wzzZ8/36WN6Oho5eXl6csvv1R2drby8/PNdZs2bdKLL76ovXv3atGiRVq6dKnZtr+/vwYPHqwXXnhBSUlJ+vrrr83vvkxUVJRsNptWrlypY8eOKS8vr9LP0bVrV/Xo0cN8tG/fXh4eHurRo0eD3peIoAMAAGBxbdq0kZ+fX7Xb+Pn5qU2bNvV+7Mcee0yenp7q1q2b2rZt6/Y1KqNHj9bKlSu1Zs0aDRw4UIMHD9bLL7+sqKgoSeemem7ZsqWuueYajRo1Sp07d9aSJUuqbddms+nzzz/XNddco/vuu09XXHGFJk6cqNTUVIWGhkqSxo0bpxtvvFEjR45U27Zt9cEHH1Rox8fHR1988YXatWunm2++WT179tQLL7wgT09PSdIrr7yili1baujQobrllls0evToWveWTZs2TY8++qgeffRR9ezZU6tWrdKKFSt0+eWXS3IO/fvggw/0ww8/qHfv3po7d66effZZlzaGDh2qBx98UBMmTFDbtm314osvmuseffRRJSQkqG/fvpozZ47mz5+v0aNHm+vfeecdFRcXa8CAAZo+fXqFttu3b6+4uDjNnDlToaGhbk+ycLHYjPID75qo3NxcBQcHKycn56LO1AAAANBUFBQUKCUlRZ06daoxtFQmLS2t2vvktGnTxtI3C4Wr6OhozZgxQzNmzGjsUipV3d93d7MB1+gAAABcAjp27EiQwSWFoWsAAAAALIceHQAAAOASU5sZ4JorenQAAAAAWA5BBwAAoBlpBvNIAResPv6eE3QAAACagbJpi4uKihq5EqDhld3vx9vbu85tcI0OAABAM+Dl5aWAgAAdO3ZM3t7e8vDg92pYj2EYys/PV1ZWlkJCQsyAXxcEHQAAgGbAZrMpPDxcKSkpOnjwYGOXAzSokJAQhYWFXVAbBB0AAIBmwsfHR5dffjnD12Bp3t7eF9STU4agAwAA0Ix4eHhUuFM8gIoY3AkAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcgg6AAAAACyHoAMAAADAcuoUdF577TV16tRJfn5+6t+/vzZs2FDt9u+//7569+6tgIAAhYeH695779Xx48frVDAAAAAA1KTWQWfJkiWaMWOGnnrqKe3YsUPDhw/XTTfdpLS0tEq337hxoyZPnqxf/epX2r17t5YuXaqtW7fq17/+9QUXDwAAAACVqXXQefnll/WrX/1Kv/71r9W1a1ctWLBAkZGRev311yvd/ttvv1V0dLSmTZumTp066Wc/+5l+85vfaNu2bRdcPAAAAABUplZBp6ioSAkJ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bZjNweGkslKOIqYUWoqKZOtMVlbiPiMRERERkRalXdCZPHlk2+jpCQ4roeElsMzplLeXBcrOBkpKZP+Wzk7g448j/6yf/hT4z/8c2f6OFt4WRkRERESZJK2CjpLBQXkLWLTgEliuNKJYQYEMLt5pypTg18XF/nBjtfo75Tc3ywmQt4atWBE+NHKq4G1hRERERJRJ0iro3HOPvBWsvR1wufwPqAzt52I2+4NJcTFw1lnA/PnK4aWgQF0fFyVKnflTeWhkIiIiIqJMkVZB57XX/Mtf+Qpw443BgcY75eVxKGQiIiIiokyWVkHnkUeAOXPkModGJiIiIiKiSNIq6Eyblrq3hbEPDBERERFR6uBAxkREREREpDlpFXRKS5O9B0RERERElA4YdIiIiIiISHPSKugQERERERGpwaBDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaw6BDRERERESaM6yg89hjj6Gqqgpmsxk1NTV4/fXXo9bfs2cPampqYDabccYZZ2DTpk3D2lkiIiIiIiI14g46W7duxapVq7Bu3TrU19dj7ty5WLRoEZqamhTrNzY24rLLLsPcuXNRX1+Pu+++G7fffju2bds24p0nIiIiIiJSohNCiHhWuOCCCzBjxgw8/vjjvrKzzjoLV199Ne67776w+mvWrMGOHTtw8OBBX9nKlSvx7rvvYt++fap+psvlgt1uR2dnJ2w2Wzy7S0REREREGqI2Gxji2Wh/fz/279+PtWvXBpUvWLAAe/fuVVxn3759WLBgQVDZwoULUVdXB4/HA6PRGLZOX18f+vr6fK87OzsByA9FRERERESZy5sJYrXXxBV0nE4nBgcHUVJSElReUlKClpYWxXVaWloU6w8MDMDpdKKsrCxsnfvuuw8///nPw8pPO+20eHaXiIiIiIg0yu12w263R3w/rqDjpdPpgl4LIcLKYtVXKvf66U9/itWrV/ted3R0oLKyEk1NTVE/DCWWy+XCaaedhmPHjvGWwhTC45KaeFxSE49LauJxSU08LqkpE4+LEAJutxvl5eVR68UVdAoLC6HX68Nab1pbW8NabbxKS0sV6xsMBhQUFCiuYzKZYDKZwsrtdnvGHMB0YrPZeFxSEI9LauJxSU08LqmJxyU18bikpkw7LmoaP+IadS07Oxs1NTXYuXNnUPnOnTsxe/ZsxXVqa2vD6r/88suYOXOmYv8cIiIiIiKikYp7eOnVq1fj97//PbZs2YKDBw/izjvvRFNTE1auXAlA3nZ20003+eqvXLkSR48exerVq3Hw4EFs2bIFdXV1+PGPfzx6n4KIiIiIiChA3H10lixZgra2NvziF79Ac3MzzjnnHLz44ouorKwEADQ3Nwc9U6eqqgovvvgi7rzzTjz66KMoLy/HI488gm9+85uqf6bJZML69esVb2ej5OFxSU08LqmJxyU18bikJh6X1MTjkpp4XCKL+zk6REREREREqS7uW9eIiIiIiIhSHYMOERERERFpDoMOERERERFpDoMOERERERFpTsoEncceewxVVVUwm82oqanB66+/HrX+nj17UFNTA7PZjDPOOAObNm1K0J5mhvvuuw/nn38+rFYriouLcfXVV6OhoSHqOrt374ZOpwubPvroowTttfbde++9Yb/f0tLSqOvwXBl7p59+uuK//VtuuUWxPs+VsfHaa6/hiiuuQHl5OXQ6HZ5//vmg94UQuPfee1FeXo6cnBzMnz8fH3zwQcztbtu2DWeffTZMJhPOPvtsPPfcc2P0CbQp2nHxeDxYs2YNpk6ditzcXJSXl+Omm27C559/HnWbTz31lOI51Nvb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", + "image/png": "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JemzAFSm/+cEHQAAAACOQ9ABAABAuZo9e7b5xn7fvn1R9c7rMX/66aeltr+0tDSZMGFCqe0P3gg6AAAAlUh+Qb7M3jhb/v3rv81c75el/v37y8iRIyWajBkzRrp06VJouY56d95550k0effdd81QzRUdWH/99Vfp16+fGWigSZMmMm7cODPCWlli1DUAAIBKYuqqqTJi+gjZkr3FvaxpclN58dwX5bL2l4nTacd2vRhlcel1XRC+7OxsOeuss2TAgAHy888/y5o1a+T666+X6tWry9133y1lhYoOAABAJQk5V3x0hVfIUVuzt5rlur606cnsnDlz5MUXXzTf/Ou0ceNG9/rFixdL9+7dzQhbvXv3ltWrV3s9/vPPP5du3bpJUlKStGrVSsaOHWuG2balp6fLxRdfLDVq1JDk5GQZPHiw7Ny5s1Bl5u233zaPT0xMNFWErKwsueWWW8zQxfq4gQMHyrJly9wVEH0evW8fsy7z13Rty5YtctVVV0ndunXNSbu+lgULFph1f/zxhzm2lJQUc3ynnnqqfPPNN2G9f3phWK18NG3a1By7vpbp06cXWVH55Zdf3O/z7Nmz5YYbbjCv134t+p7YzeYeffRRueaaa8zx6bDlL730kns/+njdXvdn0+fRZbpfXa/BRdWpU8cs18/bnw8++EByc3PN+3jSSSfJZZddJg899JC88MILZVrVIegAAAA4nDZP00qOJYVPKu1lI6ePLPVmbBpwevXqJTfffLNp9qWTXuzUNmrUKHn++edl0aJFEhcXJzfeeKN73ddffy3XXnut3HHHHbJy5UqZOHGiOVF+/PHHXcdtWXLJJZfInj17TJiaOXOmCRdDhgzxOoZ169bJRx99JJ988on7pP2CCy6QHTt2yFdffWXCVteuXeWMM84w+9LHa5WhY8eO7mP23afav3+/aYq1bds2+eyzz0wwuu+++0w4sdeff/75JtwsXbpUzjnnHLnoootMOAvn/dP357nnnpPly5ebfQwaNEjWrl0b0uN79+5t+gBpmLNfyz333ONe/+yzz8rJJ58sS5YskQcffFDuvPNO8z6GQj9HfU+VBlTdtx6vPz/++KN5rzSs2fS16HvnGXxLG03XAAAAotTBIwfl98zfg263aNuiQpUc37CzOXuzvLX0LeneuHvQ/bWr306qxQe/aGmtWrXMdX+0YuOv2ZeG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2uTJk+Xhhx82688880wTNoYOHWo60y9cuNBUCbTPj45+Fog+Tpto6UAGWnHR49LwoPvVQRHsY9a+P3pir8d8+PDhQvu5+uqrTb8X3Y/2bVm/fr3pnP/jjz+a9RrQpk6davahTc10dLNQX7tnVUiDgb5uDX3an0b3N2LECPdzaMjT92jNmjXy5ZdfmsELPKWlpZmQ9e2335rXos3+bHrczzzzjHms9vmZMmWKe99agerZs6c89dRTJkB+//337vfeps0CtQKkzfO0v5I+T6CQo/2vdGCJyy+/3ARNnTQklikrCmRlZWnNzMwBAAAqo0OHDlkrV6408+JYv360tWHDOL/rdLmuLwurV6+2evbsaVWtWtWcz23YsMGaNWuWub137173dkuXLnWvt02fPt3q3bu3eWxycrLVo0cPa9KkSe71mzZtsgYNGmRVr17dqlmzpnXllVdaO3bscK8fPXq01blz50LHlJ2dbd1+++1W48aNrfj4eKtZs2bW0KFDrfT0dLM+NzfXuvzyy63atWubY3rnnXfMcr09bdo09342btxottNjq1atmtW9e3drwYIFZp2+jgEDBphj1/2//PLLVr9+/awRI0a4H9+iRQtr/PjxAd+7/Px8a+zYsVaTJk3Mcepr+d///ue1zbx586xOnTpZSUlJVt++fa0pU6YUeh+HDx9u1atXzyzX98R+bt334MGDzbGnpKRYEyZM8Nq3/n+zP7suXbpYM2bMMPvQz882btw4KzU11YqJibGGDRvm93Xocn2c76TvR3H+v4eaDWL0n3CCkaY5HYpOO3JpKUtHj9AkG6w93l133WXSuJbgdLSM4cOHh/yc2hlLR4zQUqSW8QAAACob7YSvVYaWLVuaPipASaSlpcnIkSPNFG3/30PNBmE3XdMRJHSovJdffjmk7fUAdQzxvn37mjHE9YJBWrayx90GAAAAgAofjOC8884zU6hef/11M0SgPVSddg7T9o86AoW20QMAAACAqBt1TTtknX322V7L9Kqub731lhmiznNYQZt2+PLs9KXlKQAAAAClY2MYI8BFqzIfdU1HVEhJSfFapvf1okk68oM/Tz75pGl3Z0+eF4ICAAAAgIgYXtrfhY78Lbc9+OCDpnORPen46AAAAAAQMU3XdHxxrep4ysjIMBdpqlevnt/HJCYmmgkAAAAAIrKioxdkmjlzpteyGTNmmAs5+eufAwAAAADlHnT0iqd6RVadlH3V2PT0dHezM70qrU2vl7Np0yZzHR29ou3bb79tBiK45557SnzwAAAAAFAqTdd0aOgBAwa472uAUcOGDZN3333XXETUDj1KL/Lz1VdfyZ133imvvPKKuWDoP/7xD4aWBgAAABA5Qad///7uwQT80bDjq1+/frJkyZLwjw4AAACOM3v2bPPF+d69e6V27doSLXQgrWnTpskll1xSKvtLS0uTkSNHmglROuoaAAAAKif9kjzaTuTHjBkjXbp0KbRcWy6dd955Ek3efffdMguTGlg1/O3bt6/I7VavXm2CrV5iJikpSVq1aiUPP/ywuaZmVI+6BgAAgMiyfbvIxIkif/2rSKNGUmkEulh9OKMJI3z6nmsf/q5du5rQtWzZMrn55puloKBAnnjiiWLsMTRUdAAAACph0Bk71jUvS9dff73MmTNHXnzxRfPNv04bN250r1+8eLEZibdatWrSu3dv882/p88//1y6devmrgKMHTvWXHTepv3CL774YqlRo4YkJyfL4MGDZefOnYUqMzoYlj5eL1+iXTD0Oo233HKLNGzY0Dxu4MCB5uTbroDo8+h9+5jtrhl6+9NPP3Xvf8uWLXLVVVdJ3bp1pXr16ua1LFiwwKz7448/zLFpFUOP79RTT5VvvvkmrPdPg8C4ceOkadOm5tj1tUyfPr3IiooOEma/z7Nnz5YbbrjBvF77teh7Yjebe/TRR+Waa64xx6f96F966SX3fvTxur09AJnS59Flul9db/fbr1Onjlmun7c/+t7rcXTu3FlatGghgwYNkqFDh8rcuXOlLBF0AAAAUCY04OilRvTbe232pVOzZs3c60eNGiXPP/+8GexKr7F44403utd9/fXXcu2118odd9whK1eulIkTJ5rA8fjjj5v1Gli0r8yePXtMmNLLmWi4GDJkiNcxrFu3Tj766CP55JNP3CftF1xwgbnOow6YpWFLKw1nnHGG2Zc+/u6775aOHTu6j9l3n/ZIxNoPfdu2bfLZZ5+ZYHTfffeZcGKvP//88024Wbp0qZxzzjly0UUXeQ3aFcr7p+/Pc889J8uXLzf70JCwdu3akB7fu3dvmTBhgglz9mvxHPn42WeflZNPPtn0pdeRk3XwMN/LwgSin6O+p0oDqu5bjzcU+ploYNP3ryzRdA0AACBKHTwo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NWpIcnKyDB48WHbu3OlVmdFq0ttvv20en5iYKJZlSVZWltxyyy3SsGFD87iBAwfKsmXL3BUQfR69bx+zLvPXdG3Lli1y1VVXSd26daV69ermtSxYsMCs++OPP8yxpaSkmOM79dRT5Ztvvgnr/SsoKJBx48ZJ06ZNzbHra5k+fXqRTQC1CmW/z7Nnz5YbbrjBvF77teh7Yjebe/TRR+Waa64xx9e4cWN56aWX3PvRx+v2nlUtfR5dpvvV9VrNUVrl0uX6eRfl4Ycflnbt2pnPqTwQdAAAAFAmNOD06tVLbr75ZtPsS6dmzZq5148aNUqef/55WbRokcTFxcmNN97oXvf111/LtddeK3fccYesXLlSJk6caALH448/btZrYLnkkktkz549JkzNnDnThIshQ4YUair10UcfySeffOI+ab/gggtkx44d8tVXX5mw1bVrVznjjDPMvvTxd999t3Ts2NF9zL77VPv375d+/frJtm3b5LPPPjPB6L777jPhxF5//vnnm3CzdOlSOeecc+Siiy4y4Syc90/fn+eee06WL19u9jFo0CBZu3ZtSI/v3bu3aTKoYc5+Lffcc497/bPPPisnn3yyLFmyRB588EG58847zfsYCv0c9T1VGlB133q8gXz33XcyZcoUeeWVV6S80HQNAAAgSh08eFB+//33oNutWrUqpP2Fup1+K69VmGBq1aolCQkJZlt/zb40tGhYUA888IAJIFpZ0gqOrtNlw4YNM+u1IqMVCA0To0ePNgFCT/43bNjgDk/vv/++CSg///yzqaCovLw8s7xBgwbuE+5ff/1VMjIyTJVEaZDQSs3HH39sKj1a4dDgVVRTtQ8//FB27dplnksrOqp169bu9Z07dzaT7bHHHpNp06aZUHTbbbeF9D7rcd1///2maqSefvppmTVrlgkvoQSGhIQE8xlotcXfa+nTp495j1WbNm3khx9+kPHjx8tZZ50VdN/ax8Z+3VoZK6qPzu7du02151//+pcJXeWFoAMAABClNORo067SohWUUNhVkJLSaoKtUaNGZq4BRPsJ6XNoiLArOCo/P98EIQ14Gso04HhWiDp06GBOuHWdHXRatGjhDjn2sWu1pV69el7HcujQIVMRCpVWh7RTvX2y7+vAgQOmCdwXX3xhqj7a5E6fI9SKTnZ2tnmchhFPet9uZldSvXr1KnS/LAaN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", "text/plain": [ "

" ] @@ -311,7 +410,7 @@ "outputs": [ { "data": { - "image/png": "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a7j22mvp378/jz/+ON27d+epp57a6+O/+OILevXqxa9+9St69+7NqaeeyvXXX8+KFSsOObyTXC4XfVL6sNa71ukoIiIiIiLyE80qOg0NDaxcuZIxY8b86PNjxoxh6dKle/2ek08+mR07dvDuu+9iWRamaTJ37lzOO++8fb5OfX09FRUVP/oIRmcffjb1/npW7Art0iYiIiIi0t40q+gUFRXh9/sxDONHnzcMg4KCgr1+z8knn8z06dMZP348UVFRZGVlkZyczL///e99vs5DDz1EUlLS7o/u3bs3J2ab+eWwXwIwdflUh5OIiIiIiMgPHdRmBGFhYT/6b8uy9vjc97799lt+9atfcc8997By5Uref/99tm7dyg033LDP57/zzjspLy/f/bF9+/aDidnq+qb1JS4yjo+2fOR0FBERERER+YGI5jw4PT2d8PDwPUZvvF7vHqM833vooYc45ZRTuOOOOwA49thjiYuLY/jw4fz5z3+mc+fOe3xPdHQ00dHRzYnmmIFZA/ls+2c0+BqIiohyOo6IiIiIiNDMEZ2oqCgGDx7M/Pnzf/T5+fPnc/LJJ+/1e2pqanC5fvwy4eHhgD0SFOomHjMRC4vpa6Y7HUVERERERJo0e+ra7bffznPPPce0adNYv349t912G3l5ebunot15551MmTJl9+MvuOAC5s2bx1NPPcWWLVv47LPP+NWvfsWwYcPo0qVLy/0kDrnyuCsB8HzjcTaIiIiIiIjs1qypawDjx4+nuLiY+++/n/z8fI4++mjeffddevbsCUB+fv6PztS58sorqays5IknnuA3v/kNycnJjBo1iocffrjlfgoHxUbF0jm+M8t3LXc6ioiIiIiINAmzQmD+WEVFBUlJSZSXl5OYmOh0nD1MenUSM9fOZNut2+iR1MPpOCIiIiIi7daBdoOD2nVNfuyGwfa0vSeXPelwEhERERERARWdFjGi1wgiXZG8tfEtp6OIiIiIiAgqOi2mX3o/NpVsIhAIOB1FRERERKTDU9FpIRf3uxhfwMf8LfP3/2AREREREWlVKjot5KahNwHw7KpnHU4iIiIiIiIqOi0kKz6L5JhkPt32qdNRREREREQ6PBWdFnRC1xPw1nipqKtwOoqIiIiISIemotOCrjjuCgCe++o5h5OIiIiIiHRsKjotaNyAcYQRxpx1c5yOIiIiIiLSoanotKAIVwS9knvxjfmN01FERERERDo0FZ0Wdlafs6j11bLWXOt0FBERERGRDktFp4XdMuwWAJ5Y9oTDSUREREREOi4VnRY2IHMAnSI68cGWD5yOIiIiIiLSYanotIJjjWPZVrYNX8DndBQRERERkQ5JRacVXD7gciwsXln3itNRREREREQ6JBWdVnDd4OsAeOnrlxxOIiIiIiLSManotIL4qHgy4zL5cueXTkcREREREemQVHRayYieIyirK6OgqsDpKCIiIiIiHY6KTiu5bpA9fe3JZU86nEREREREpONR0Wklo3uPJsIVwRsb3nA6ioiIiIhIh6Oi00pcLhd9U/vyXdF3TkcREREREelwVHRa0QVHXEBjoJFPcj9xOoqIiIiISIeiotOKbh52MwBPr3za4SQiIiIiIh2Lik4r6pHUg8ToRD7O/djpKCIiIiIiHYqKTisb2mUo+VX51DTUOB1FRERERKTDUNFpZe5j3QBMWz3N4SQiIiIiIh2Hik4rm3j0RMIIY9baWU5HERERERHpMFR0WllURBTdEruxumC101FERERERDoMFZ02cMZhZ1DdWM2Gog1ORxERERER6RBUdNrATUNvAuDJ5U86nEREREREpGNQ0WkDQ7oMITo8mvf++57TUUREREREOgQVnTZydObRbCndQiAQcDqKiIiIiEi7p6LTRi476jICVoDXvnvN6SgiIiIiIu2eik4buWHIDQC8sPoFh5OIiIiIiLR/KjptJDkmmbROaXy+43Ono4iIiIiItHsqOm3o1B6nUlJbQlFNkdNRRERERETaNRWdNnT1wKsBeHrF0w4nERERERFp31R02tD5fc8nPCyceevnOR1FRERERKRdU9FpQy6Xiz6pfVhXuM7pKCIiIiIi7ZqKThs7r+95NPgb+HLHl05HERERERFpt1R02tjNQ28GYOryqQ4nERERERFpv1R02lif1D7ERcaxMHeh01FERERERNotFR0HDO48mJ0VO2nwNTgdRURERESkXVLRccCkYyZhYfHyNy87HUVEREREpF1S0XHAFcdfAcD0b6Y7nEREREREpH1S0XFATEQMXRO6siJ/hdNRRERERETaJRUdh4zqNYqqhiq2lm51OoqIiIiISLujouOQ64dcD8ATy59wOImIiIiISPujouOQU3qcQpQrinc3vut0FBERERGRdkdFx0H9M/qzqWQTgUDA6SgiIiIiIu2Kio6DxvYbi9/y8/7m952OIiIiIiLSrqjoOOjGITcC8Nyq5xxOIiIiIiLSvqjoOCgzPpOUmBSW5C1xOoqIiIiISLuiouOwk7qdRGFNIWV1ZU5HERERERFpN1R0HHbVwKsAeGblMw4nERERERFpP1R0HHZJv0twhbmY++1cp6OIiIiIiLQbKjoOc7lc9EruxRrvGqejiIiIiIi0Gyo6QeDsw8+mzlfH6vzVTkcREREREWkXVHSCwC1DbwHgyeVPOpxERERERKR9UNEJAv0z+hMbGcv8LfOdjiIiIiIi0i6o6ASJ443jySvPwxfwOR1FRERERCTkqegEiQlHT8DCYsaaGU5HEREREREJeSo6QeL783Q833gcTiIiIiIiEvpUdIJEfFQ8WfFZLNu5zOkoIiIiIiIhT0UniIzsOZLy+nJ2VOxwOoqIiIiISEhT0Qki1w2+DoCpy6c6nEREREREJLSp6ASRUb1HEeGK4M0NbzodRUREREQkpKnoBJl+af3YULzB6RgiIiIiIiFNRSfIXNjvQnwBHwu3LnQ6ioiIiIhIyFLRCTI3DrkRgGdWPuNwEhERERGR0KWiE2S6JXYjKTqJxdsWOx1FRERERCRkqegEoWFdh1FQVUBVQ5XTUUREREREQpKKThCacuwUAJ5f9bzDSUREREREQpOKThCacMwEwghj9rrZTkcREREREQlJKjpBKMIVQY+kHqwuWO10FBERERGRkKSiE6TG9BlDra+W9YXrnY4iIiIiIhJyVHSC1E1DbgLgieVPOJxERERERCT0qOgEqeM7H09MRAzv//d9p6OIiIiIiIQcFZ0gdkzmMeSW5RIIBJyOIiIiIiISUlR0gti4o8YRsALMXT/X6SgiIiIiIiFFRSeIXT/4egBeXP2is0FEREREREKMik4QS4xJJCM2gy92fOF0FBERERGRkKKiE+SG9xhOaV0p3iqv01FEREREREKGik6Qu2bQNQA8teIph5OIiIiIiIQOFZ0gd3afswkPC+e1715zOoqIiIiISMhQ0QlyLpeLvql9WV+43ukoIiIiIiIhQ0UnBJx/xPk0BBr4LO8zp6OIiIiIiIQEFZ0QcMuwWwCt0xEREREROVAqOiGgZ3JPEqISWJS7yOkoIiIiIiIhQUUnRAzpMoRdlbuo89U5HUVEREREJOip6ISIScdMAuCl1S85nEREREREJPip6ISIKcdOIYwwZqyZ4XQUEREREZGgp6ITIqIiouia2JWV+SudjiIiIiIiEvRUdELI6N6jqW6sZnPJZqejiIiIiIgENRWdEHLz0JsBeGLZEw4nEREREREJbio6IWRo16FEh0fzzqZ3nI4iIiIiIhLUVHRCzICMAWwp3UIgEHA6ioiIiIhI0FLRCTFj+4/Fb/l5e9PbTkcREREREQlaKjoh5oYhNwAw7atpDicREREREQleKjohJj02ndROqSzJW+J0FBERERGRoKWiE4JO7nYyxbXFlNSUOB1FRERERCQoqeiEoKsHXg3Af1b+x+EkIiIiIiLBSUUnBF105EW4wly8uv5Vp6OIiIiIiAQlFZ0Q5HK56JPSh7XetU5HEREREREJSio6Iersw8+m3l/Pil0rnI4iIiIiIhJ0VHRC1C+H/RKAqcunOpxERERERCT4qOiEqL5pfYmLjOOjLR85HUVEREREJOio6ISwgVkD2VGxgwZfg9NRRERERESCiopOCJt4zEQsLKavme50FBERERGRoKKiE8KuPO5KADzfeJwNIiIiIiISZFR0QlhsVCyd4zuzIl87r4mIiIiI/JCKTog7rddpVNRXkFee53QUEREREZGgoaIT4m4YfAMATy570uEkIiIiIiLBQ0UnxI3oNYJIVyRvbXzL6SgiIiIiIkFDRacd6Jfej00lmwgEAk5HEREREREJCio67cDF/S7GF/Axf8t8p6OIiIiIiAQFFZ124KahNwHw7KpnHU4iIiIiIhIcVHTagaz4LJJjkvk071Ono4iIiIiIBAUVnXbihK4n4K32UtVQ5XQUERERERHHqei0E1ccdwUAz6x8xuEkIiIiIiLOU9FpJ8YNGEcYYcxZN8fpKCIiIiIijlPRaSciXBH0Su7FN+Y3TkcREREREXGcik47clafs6j11bLWXOt0FBERERERR6notCO3DLsFgCeWPeFwEhERERERZ6notCMDMgfQKaITH2750OkoIiIiIiKOUtFpZ441jiW3LBdfwOd0FBERERERx6jotDOXD7gcC4tX1r3idBQREREREceo6LQz1w2+DoCXvn7J4SQiIiIiIs5R0Wln4qPiyYzL5MudXzodRURERETEMQdVdKZOnUrv3r2JiYlh8ODBfPrppz/7+Pr6eu666y569uxJdHQ0ffr0Ydq0aQcVWPZvRM8RlNWVUVBV4HQUERERERFHNLvozJ49m1tvvZW77rqLr776iuHDh3POOeeQl5e3z++5/PLLWbBgAc8//zwbNmxg5syZ9OvX75CCy75dN8ievvbksicdTiIiIiIi4owwy7Ks5nzDCSecwKBBg3jqqad2f65///5cfPHFPPTQQ3s8/v3332fChAls2bKF1NTUgwpZUVFBUlIS5eXlJCYmHtRzdCSBQIDov0TTP70/39z4jdNxRERERERazIF2g2aN6DQ0NLBy5UrGjBnzo8+PGTOGpUuX7vV73nzzTYYMGcIjjzxC165dOeKII/jtb39LbW3tPl+nvr6eioqKH33IgXO5XPRN7ct3Rd85HUVERERExBHNKjpFRUX4/X4Mw/jR5w3DoKBg7+tBtmzZwpIlS1i7di2vvfYajz/+OHPnzuXmm2/e5+s89NBDJCUl7f7o3r17c2IKcMERF9AYaOST3E+cjiIiIiIi0uYOajOCsLCwH/23ZVl7fO57gUCAsLAwpk+fzrBhwzj33HN57LHHePHFF/c5qnPnnXdSXl6++2P79u0HE7NDu3mYXSSfXvm0w0lERERERNpeRHMenJ6eTnh4+B6jN16vd49Rnu917tyZrl27kpSUtPtz/fv3x7IsduzYQd++fff4nujoaKKjo5sTTX6iR1IPEqMT+Tj3Y6ejiIiIiIi0uWaN6ERFRTF48GDmz5//o8/Pnz+fk08+ea/fc8opp7Br1y6qqqp2f27jxo24XC66det2EJHlQA3tMpT8qnxqGmqcjiIiIiIi0qaaPXXt9ttv57nnnmPatGmsX7+e2267jby8PG644QbAnnY2ZcqU3Y+fNGkSaWlpXHXVVXz77bd88skn3HHHHVx99dV06tSp5X4S2YP7WDcA01brzCIRERER6ViaXXTGjx/P448/zv3338/xxx/PJ598wrvvvkvPnj0ByM/P/9GZOvHx8cyfP5+ysjKGDBnC5MmTueCCC/jXv/7Vcj+F7NXEoycSRhiz1852OoqIiIiISJtq9jk6TtA5Ogevxz96UFJbQtUfq/b/YBERERGRINcq5+hI6DnjsDOobqxmQ9EGp6OIiIiIiLQZFZ127qahNwHw5PInHU4iIiIiItJ2VHTauSFdhhAdHs17/33P6SgiIiIiIm1GRacDODrzaLaUbiEQCDgdRURERESkTajodACXHXUZASvAa9+95nQUEREREZE2oaLTAdwwxD7j6MXVLzobRERERESkjajodADJMcmkdUpj6Y6lTkcREREREWkTKjodxKk9TqWktoSimiKno4iIiIiItDoVnQ7i6oFXA/D0iqcdTiIiIiIi0vpUdDqI8/ueT3hYOPPWz3M6ioiIiIhIq1PR6SBcLhd9UvuwrnCd01FERERERFqdik4Hcl7f82jwN/Dlji+djiIiIiIi0qpUdDqQm4feDMBTK55yOImIiIiISOtS0elA+qT2IS4yjgVbFzgdRURERESkVanodDCDOw9mZ8VOGnwNTkcREREREWk1KjodzKRjJmFh8fI3LzsdRURERESk1ajodDBXHH8FANO/me5wEhERERGR1qOi08HERMTQNaErK/JXOB1FRERERKTVqOh0QKN6jaKqoYqtpVudjiIiIiIi0ipUdDqg64dcD8DU5VMdTiIiIiIi0jpUdDqgU3qcQpQrirc3vu10FBERERGRVqGi00H1z+jPppJNBAIBp6OIiIiIiLQ4FZ0Oamy/sfgtP+9vft/pKCIiIiIiLU5Fp4O6cciNADy36jmHk4iIiIiItDwVnQ4qMz6TlJgUluQtcTqKiIiIiEiLU9HpwE7qdhKFNYWU1ZU5HUVEREREpEWp6HRgVw28CoBnVz7rcBIRERERkZalotOBXdLvElxhLl759hWno4iIiIiItCgVnQ7M5XLRK7kXa7xrnI4iIiIiItKiVHQ6uLMPP5s6Xx2r81c7HUVEREREpMWo6HRwtwy9BYAnlz/pcBIRERERkZajotPB9c/oT2xkLPO3zHc6ioiIiIhIi1HREY43jievPA9fwOd0FBERERGRFqGiI0w4egIWFrPWzHI6ioiIiIhIi1DRkd3n6bz8zcsOJxERERERaRkqOkJ8VDxZ8Vks27nM6SgiIiIiIi1CRUcAGNlzJOX15eyo2OF0FBERERGRQ6aiIwBcN/g6AKYun+pwEhERERGRQ6eiIwCM6j2KCFcEb2540+koIiIiIiKHTEVHduuX1o8NxRucjiEiIiIicshUdGS3C/tdiC/gY+HWhU5HERERERE5JCo6stuNQ24E4JmVzzicRERERETk0KjoyG7dEruRFJ3E4m2LnY4iIiIiInJIVHTkR4Z1HUZBVQFVDVVORxEREREROWgqOvIjU46dAsDzq553OImI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R8WzYOsCp6OIiIiISAegoiNtZlDWIHZW7KTB1+B0FBERERFp51R0pM1MOmYSFhYvf/Oy01FEREREpJ1T0ZE2c8XxVwAw/ZvpDicRERERkfbuoIrO1KlT6d27NzExMQwePJhPP/30gL7vs88+IyIiguOPP/5gXlZCXExEDF0TurIif4XTUURERESknWt20Zk9eza33nord911F1999RXDhw/nnHPOIS8v72e/r7y8nClTpjB69OiDDiuhb1SvUVQ1VLG1dKvTUURERESkHWt20Xnssce45ppruPbaa+nfvz+PP/443bt356mnfn7b4Ouvv55JkyZx0kknHXRYCX03Dr0RgKnLpzqcRERERETas2YVnYaGBlauXMmYMWN+9PkxY8awdOnSfX7fCy+8wObNm/m///u/A3qd+vp6KioqfvQh7cNJ3U8iKjyKtze+7XQUEREREWnHmlV0ioqK8Pv9GIbxo88bhkFBQcFev2fTpk384Q9/YPr06URERBzQ6zz00EMkJSXt/ujevXtzYkqQ65/en00lmwgEAk5HEREREZF26qA2IwgLC/vRf1uWtcfnAPx+P5MmTeK+++7jiCOOOODnv/POOykvL9/9sX379oOJKUFqbL+x+C0/729+3+koIiIiItJONavopKenEx4evsfojdfr3WOUB6CyspIVK1Zwyy23EBERQUREBPfffz9ff/01ERERLFy4cK+vEx0dTWJi4o8+pP24cYi9Tue5Vc85nERERERE2qtmFZ2oqCgGDx7M/Pnzf/T5+fPnc/LJJ+/x+MTERNasWcPq1at3f9xwww0ceeSRrF69mhNOOOHQ0ktIyozPJCUmhSV5S5yOIiIiIiLt1IEtmvmB22+/HbfbzZAhQzjppJN45plnyMvL44YbbgDsaWc7d+7k5ZdfxuVycfTRR//o+zMzM4mJidnj89KxnNTtJN7977uU1ZWRHJPsdBwRERERaWeavUZn/PjxPP7449x///0cf/zxfPLJJ7z77rv07NkTgPz8/P2eqSNy1cCrAHh25bMOJxERERGR9ijMsizL6RD7U1FRQVJSEuXl5Vqv004EAgEi/xzJ4M6DWfaLZU7HEREREZEQcaDd4KB2XRM5VC6Xi17JvVjjXeN0FBERERFph1R0xDFnH342db46VuevdjqKiIiIiLQzKjrimFuG3gLAk8ufdDiJiIiI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", + "image/png": "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WfC3gkQHAAAAQI5DogMAAAAnkyZNMrNe5SS33HKLPP3009l+3iVLlpjWCdtsg96K7f79+815Nm7c6PK83jyXvyLRAQAAASUlNUWW7F8iX2/+2iz1va88/PDD0rlz50zv9/rrr0ujRo2ypAwnT56Unj17SuHChc1L/52bp/B2V8H/5ptv5M033xRf69q1q+zcuTND22YmKapQoYIcPnxY6tWrJ95+xit46VxZjVnXAABAwPgm7hsZvGCwHEo8ZF9XPqK8fNjxQ7m39r2SGz344INy6NAhWbBggXnfp08fk+zMmzdPAklycrKEhoZ67fjFihUTf5lRzDarWFbHTn93JjvkyZMn2851PWjRAQAAAZPk3D/zfqckR/2Z+KdZr597w6xZs6R+/fqmcqpTY992221y7tw50yozefJk+e6770wLgr60NUENHTpUatSoYWaOqlKlirz66qv22aP0W/o33nhDfv/9d/t+uk6dPn3aJCo6pW5ERIS0adPGbOdOXFycSXC++OILad68uXmNHz9evv/+e9mxY4fHVqBevXpJ0aJFTRlvv/122bVr11Xbffvtt+Y68uXLJ+3atZODBw/aP9Ny3XrrrVKoUCFT1ujoaFm3bp3985UrV0qrVq1M3LQF4KmnnjJxs4mKipK33nrLtBhoS9QTTzxhyv/iiy86leHYsWOSN29eWbx4sXk/ZcoUadKkiTmvVrY10bP95op2qdIyKb02ja0e31XXtfRiYGtN+emnn6R27doSHh4uHTt2NC0Znvzwww8mZnrdWhYtk6dWGndx1GfpkUceMc+E7TnRZ85d7Nx1J1uxYoU0bNjQ3MNmzZrJ5s2bPbYsfvDBB+b4ts9dPeOuzvXrr79K06ZNJSwszPz2jd7Hy5cv2z/X+Osz8MILL5ikU++d7Xq8hUQHAAD4Pe2epi05llhXfWZb9/SCp7O8G5tWart37y6PPvqoSSq0knfvvfeaHzV8/vnn5YEHHrBXfvXVokULs59WWrVCu23bNvnwww9N8jF69Gh716XnnntO6tata99P1+kx77zzTvPDqlpZjo2NlcaNG0vbtm3lxIkTLsv322+/mYquVmBtbrzxRrNOEw13tIKslem5c+eaY+i577jjDqepfPVHG0eOHGkqulpZTkxMlG7dutk/79Gjh5QvX17Wrl1ryqoVW01IlFamO3ToYGK1adMm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e/3116VRo0ZZUuF87LHHpHLlypI/f36pWrWqDB8+XJKTkyW3clfB/+abb+TNN98UX+vatavs3LkzQ9tmJimqUKGCHD58WOrVqyfefsYreOlcWS3E1wUAAADIiH37XpegoDwSFfXqVZ/t3/+mWFaKVK78eq4K5vbt2yU1NVU+++wzqVatmmzZskWeeOIJOXfunLz33nsSSDQ5Cw0N9drxixUrJv5AE1J9eSN2kZGRkh3y5MmTbee6HrToAACAgKBJzv79r5mkxpG+1/X6uTfMmjVL6tevbyqnxYsXl9tuu80kEtoqM3nyZPnuu+9MC4K+tDVBDR06VGrUqCEFChSQKlWqyKuvviqXLl2yf0v/xhtvyO+//27fT9ep06dPS58+faRUqVISEREhbdq0Mdu507FjR5k4caK0b9/enOfuu++W559/3rReeHLy5Enp1auXFC1a1JTx9ttvl127dl213bfffmuuI1++fNKuXTs5ePCg/TMt16233iqFChUyZY2OjpZ169bZP1+5cqW0atXKxE1bAJ566ikTN5uoqCh56623TItB4cKFTYLWvHlzefHFF53KcOzYMcmbN68sXrzYvJ8yZYo0adLEnFcr2w8++KDEx8fbW7i0TEqvTWOrx3fVdS29GNhaU3766SepXbu2hIeHm3hrS4YnP/zwg4mZXreWRcvkqZXGXRz1WXrkkUfMM2F7TvSZcxc7d93JVqxYIQ0bNjT3sFmzZrJ582aPLYsffPCBOb7tc1fPuKtz/frrr9K0aVMJCwuTMmXKmPt4+fJl++caf30GXnjhBZN06r2zXY+3kOgAAICAoC05UVEjnJIdW5Kj61219FwvrdR2795dHn30UYmLizOVvHvvvVcsyzIJxQMPPGCv/OqrRYsWZj+ttGqFdtu2bfLhhx/K+PHjZfTo0fauS88995zUrVvXvp+u02PeeeedcuTIEVNZjo2NlcaNG0vbtm3lxIkTGS6zVozTa73QCrJWpufOnSu//fabOfcdd9xhT8bU+fPnZeTIkaaiq5XlxMRE6datm/3zHj16SPny5WXt2rWmrFqx1YREaWW6Q4cOJlabNm2SGTNmyPLly2XgwIFO5Xj33XdN9yfdX5NBPebXX39tymOj+5YuXVpat25tb73QLmiaIGgitm/fPnsyownV7Nmzzb937NhhYqvxv54YaMvYV199JUuX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dKjUqFFDChQoIFWqVJFXX31VLl26ZP+W/o033jAJiW0/XadOnz4tffr0kVKlSklERIS0adMmQ4nLjz/+KD///LO89957GbqmkydPSq9evaRo0aKmjLfffrvs2rXrqu2+/fZbcx2aRLZr104OHjxo/0zLdeutt0qhQoVMWaOjo2Xduv8fSrBy5Upp1aqViZu2ADz11FMmbjZRUVHy1ltvmRaDwoULyxNPPCHNmzeXF1980akMx44dk7x588rixYvN+ylTpkiTJk3MebWy/eCDD0p8fLy9S5WWSem1aWz1+K66rqUXA1tryk8//SS1a9eW8PBw6dixo2nJ8OSHH34wMdPr1rJomTy10riLoz5LjzzyiHkmbM+JPnPuYueuO9mKFSukYcOG5h42a9ZMNm/e7LFl8YMPPjDHt33u6hl3da5ff/1VmjZtKmFhYVKmTBlzHy9fvmz/XOOvz4Am5Jp06r2zXY+35IhEp3v97mKJJVM3T/V1UQAAQA6ildru3bvLo48+KnFxcaaSd++994plWfL888/LAw88YK/86qtFixZmP620aoV227Zt8uGHH8r48eNl9OjR9q5Lzz33nNStW9e+n67TY955551y5MgRU1mOjY2Vxo0bS9u2beXECfe/GXj06FFT0f3qq69MhT0jtIKslem5c+fKb7/9Zs59xx132JMxdf78eRk5cqSp6GplOTExUbp162b/vEePHlK+fHlZu3atKatWbDUhUVqZ7tChg4nVpk2bZMaMGbJ8+XIZOHCgUzneffdd0/1J99dkUI/59ddfm/LY6L6lS5eW1q1b21svtAuaJgiaiO3bt8+ezGhCNXv2ldl4tXVPY6vxv54YaPKosV26dKlpWdT77o4mgnrNehxNAh5//PGrEre03MVRnyVNOjT5sT0njudOGzt3hgwZYq5Bj68J9N133+10jZ54esYd/fnnn+aaY2JizH0ZN26cfPnllyYZc6TPUsGCBWX16tUyatQoGTFihCxcuFC8xgoAp0+f1qfdLF05d/GcJa+L1WZSm2wvGwAASN+FCxesbdu2maWjc+fOWbGxsem+pkyZYuoC6b10u/SOpefMKN1ej7t//36Xn/fu3dvq1KlTuscZNWqUFR0dbX8/fPhwq2HDhk7bLFq0yIqIiLCSkpKc1letWtX67LPPXB43NTXV6tixo/Xmm2+a9/v27TPl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NjHt2LGjacnw5IcffjAx0+vWsmiZPLXSuIujPkuPPPKIeSZsz4k+c+5i56472YoVK6Rhw4bmHjZr1kw2b97ssWXxgw8+MMe3fe7qGXd1rl9//VWaNm0qYWFhUqZMGXMfL1/+/yEkGn99Bl544QWTdOq9s12Pt+TYREe1qtRKTiWdkiNnj/i6KAAA4Dpoparym5VFUt1skCrmc90uK2mltnv37vLoo49KXFycqeTde++9YlmWPP/88/LAAw/YK7/6atGihdlPK61aod22bZt8+OGHMn78eBk9erS969Jzzz0ndevWte+n6/SYd955pxw5csRUlmNjY6Vx48bStm1bOXHihMdy/utf/zJJmFZaR44cab7h90QryFqZnjt3rvz222/m3HfccYc9GVPnz583x9KKrlaWExMTpVu3bvbPe/ToIeXLl5e1a9easmrFVhMSpZXpDh06mFht2rRJZsyYIcuXL5eBA6/MjGvz7rvvmu5Pur8mg3rMr7/+2pTHRvctXbq0tG7d2rzXa9MuaJogaCK2b98+ezKjCdXs2bPNv3fs2GFiq/G/nhi899578tVXX8nSpUvlwIED5r67o4mgXrMeR5OAxx9/PN1uhO7iqM+SJh2a/NieE8dzp42dO0OGDDHXoMfXBPruu+92ukZPPD3jjv78809zzTExMea+jBs3Tr788kuTjDnSZ6lgwYKyevVqGTVqlGmJXLhwoXiNFQBOnz6tT7tZZsbPu3+25HWxXln0itfKBgAA0nfhwgVr27ZtZuno8rnLVmJsYoZep9edtlbXWW0tDl5sLRaHV/Bis14/z8hx9JwZFRsba+og+/fvd/l57969rU6dOqV7nFGjRlnR0dH298OHD7caNmzotM2iRYusiIgIKykpyWl91apVrc8++8ztsf/9739bS5YssX7//Xdr/PjxVokSJazHHnvM7fY7d+4017RixQr7uoSEBCt//vzWzJkzzfuJEyeabVatWmXfJi4uzqxbvXq1eV+oUCFr0qRJLs/Rs2dPq0+fPk7rli1bZgUHB9ufgUqVKlmdO3d22iY+Pt4KCQmxli5dal/XvHlza8iQIW6vZ82aNaZcZ86cMe8XL15s3p88edJpu9atW1uDBw/OdAx2795t32bs2LFW6dKl3ZZl2LBhVu3ata3U1FT7uqFDhzqVR49buHBh++ee4ph2WxtXsdu3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", "text/plain": [ "
" ] @@ -2521,7 +2620,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.13.9" } }, "nbformat": 4,