diff --git a/.gitignore b/.gitignore index 60fceb1..26661b0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ docs/.$DB_Diagram.drawio.bkp build/* dist/* app.spec +*.drawio.bkp diff --git a/README.md b/README.md index 030f8d8..d832052 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,12 @@ -# GUI для работы с байесовским выводом (байесовские сети) +![GitHub Release](https://img.shields.io/github/v/release/Digiratory/bayes_model?link=https%3A%2F%2Fgithub.com%2FDigiratory%2Fbayes_model%2Freleases) +![GitHub Issues or Pull Requests](https://img.shields.io/github/issues/Digiratory/bayes_model?link=https%3A%2F%2Fgithub.com%2FDigiratory%2Fbayes_model%2Fissues) +![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/Digiratory/bayes_model/total?label=GitHub%20Downloads) +![PyPI - Downloads](https://img.shields.io/pypi/dm/bn_modeller?label=PyPI%20-%20Downloads&link=https%3A%2F%2Fpypi.org%2Fproject%2Fbn-modeller%2F) -на основе библиотеки py_banshee - - -- Разрабатывалась для задачи поиска когнитивной состовляющий при назначении слуховых аппаратов, но хочется, чтобы можно было использовать для любых данных - -Если не работает именно py_banshee, попробуй залесть в код библиотеки py_banshee и исправить: -/home/work/.local/lib/python3.8/site-packages/py_banshee - -predict 307 - -func_i = interp1d(fe, xe, kind=way, fill_value="extrapolate") # interpolation fill_value="extrapolate" +

+

BN Modeller

+

An open-source application designed to facilitate feature dependency modeling and evaluation using Bayesian Networks.

+

## Instalation @@ -20,24 +16,13 @@ You can install this project using pip: pip install bn_modeller ``` -## Build - -### Build Executable file for Windows - -1. Install pyinstaller -2. Execute the following command: -```bash -pyinstaller --onefile --add-data="./bn_modeller/resources/icon.ico;." --icon=./bn_modeller/resources/icon.ico --name=bn_modeller.exe --windowed ./bn_modeller/app.py - -``` -## Instalation +or can download the latest Windows executable from the [BN Modeller GitHub Releases page](https://github.com/Digiratory/bayes_model/releases). ### Graphviz -A Graphviz error could arise. -To solve the problem add the Graphviz executables on your systems' PATH as follows: +A Graphviz error could arise. To solve the problem add the Graphviz executables on your systems' PATH as follows: -1. Install windows package from: https://graphviz.org/download/ (Linux and Mac instructions can be found here as well) +1. Install windows package from: (Linux and Mac instructions can be found here as well) 2. Install python graphviz package 3. Press the Windows key 4. Type in the search box: edit environment variables for your account @@ -52,7 +37,29 @@ Once have done that, restart your python IDE (if it is open). If this was runnin Anaconda Command prompt), restart this prompt as well to make sure the prompt finds the new environment variables. -https://pygraphviz.github.io/documentation/stable/install.html + + +## Launch Application + +To launch the application installed with `pip`, run: + +```bash +bn_modeller +``` + +If you have downloaded BN Modeller using the Windows executable, simply double-click the `bn_modeller.exe` file located in the directory. + +## Build + +### Build Executable file for Windows + +1. Install pyinstaller +2. Execute the following command: + +```bash +pyinstaller --onefile --add-data="./bn_modeller/resources/icon.ico;." --icon=./bn_modeller/resources/icon.ico --name=bn_modeller.exe --windowed ./bn_modeller/app.py + +``` ## Troubleshooting @@ -63,7 +70,3 @@ This high storage utilization probably caused by WindowsSearch Engine. To mitiga 1. Press Win to open Start Menu and type in Index. 2. Click on Indexing Options. 3. On this next screen, hit Advanced > (Tab) File Types. For extention `.sqlite` select "Index Properties Only". - -## bn_visualize - -turn off ```plt.show``` diff --git a/docs/DB_Diagram.drawio b/docs/DB_Diagram.drawio deleted file mode 100644 index 9e16f0d..0000000 --- a/docs/DB_Diagram.drawio +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..a11b457 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,16 @@ +title: BN Modeller +description: Application for feature dependency modeling and evaluation. +show_downloads: false +remote_theme: "just-the-docs/just-the-docs" +site: + url: https://digiratory.github.io/bayes_model/ +plugins: + - jekyll-remote-theme +defaults: + - scope: + path: "assets/img" + values: + image: true +search_enabled: false +nav_enabled: true +heading_anchors: true diff --git a/docs/assets/img/Diagrams-Usage-Workflow-1.png b/docs/assets/img/Diagrams-Usage-Workflow-1.png new file mode 100644 index 0000000..e91e399 Binary files /dev/null and b/docs/assets/img/Diagrams-Usage-Workflow-1.png differ diff --git a/docs/assets/img/Diagrams-Usage-Workflow-2.png b/docs/assets/img/Diagrams-Usage-Workflow-2.png new file mode 100644 index 0000000..cb210ab Binary files /dev/null and b/docs/assets/img/Diagrams-Usage-Workflow-2.png differ diff --git a/docs/assets/img/Diagrams-Usage-Workflow-3.png b/docs/assets/img/Diagrams-Usage-Workflow-3.png new file mode 100644 index 0000000..412e057 Binary files /dev/null and b/docs/assets/img/Diagrams-Usage-Workflow-3.png differ diff --git a/docs/assets/img/bn_setup_page.png b/docs/assets/img/bn_setup_page.png new file mode 100644 index 0000000..030dea4 Binary files /dev/null and b/docs/assets/img/bn_setup_page.png differ diff --git a/docs/assets/img/bn_viz_page.png b/docs/assets/img/bn_viz_page.png new file mode 100644 index 0000000..3e57975 Binary files /dev/null and b/docs/assets/img/bn_viz_page.png differ diff --git a/docs/assets/img/evaluation_of_var_corr.png b/docs/assets/img/evaluation_of_var_corr.png new file mode 100644 index 0000000..e49bc92 Binary files /dev/null and b/docs/assets/img/evaluation_of_var_corr.png differ diff --git a/docs/assets/img/startup_dialog_1.png b/docs/assets/img/startup_dialog_1.png new file mode 100644 index 0000000..639bb28 Binary files /dev/null and b/docs/assets/img/startup_dialog_1.png differ diff --git a/docs/assets/img/startup_dialog_2.png b/docs/assets/img/startup_dialog_2.png new file mode 100644 index 0000000..569e90a Binary files /dev/null and b/docs/assets/img/startup_dialog_2.png differ diff --git a/docs/assets/img/startup_dialog_3.png b/docs/assets/img/startup_dialog_3.png new file mode 100644 index 0000000..15cd657 Binary files /dev/null and b/docs/assets/img/startup_dialog_3.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..2fc94bf --- /dev/null +++ b/docs/index.md @@ -0,0 +1,72 @@ +--- +layout: default +--- + +# Bayesian Networks Modeler + +Welcome to the BN Modeller Documentation. + +BN Modeller is an open-source application designed to facilitate feature dependency modeling and evaluation using Bayesian Networks. In research fields like medicine and biology, understanding the complex relationships between different factors – such as genes, proteins, or patient characteristics – is crucial for advancing scientific discovery. BN Modeller provides a powerful tool to explore these relationships and gain deeper insights into the underlying biological or medical phenomena of interest. + +**What are Bayesian Networks?** Briefly, they are visual models that represent relationships between variables. They allow researchers to represent cause-and-effect relationships, or correlations, between different factors, even when those relationships are not fully understood. + +At its core, BN Modeller provides a user-friendly graphical interface for constructing, visualizing, and analyzing Bayesian Networks. It offers a range of tools for both network construction and inference, enabling users to: + +* **Visualize Complex Relationships:** Build and visualize Bayesian Networks intuitively, even without extensive technical expertise. The graphical interface allows you to represent factors and their connections in a clear and understandable way. +* **Perform Robust Dependency Analysis:** Leverage powerful inference tools to evaluate the strength and nature of feature dependencies. This helps determine how changes in one factor might influence others. +* **Advance Research with Guidance:** Access practical guidelines and best practices to support feature dependency modeling and evaluation. These resources are designed to help researchers, regardless of their prior experience with Bayesian Networks, effectively utilize the software. +* **Understand Key Concepts:** Find explanations of fundamental Bayesian Network concepts and terminology to build a solid foundation for your research. + +We invite you to explore the documentation and discover how BN Modeller can enhance your research and analysis workflows. + +## Features + +BN Modeller provides a comprehensive suite of tools designed to facilitate the creation, analysis, and visualization of Bayesian Networks. The following features are available to support your research workflows: + +* **Data Import:** BN Modeller supports the import of datasets from common file formats, including CSV (Comma Separated Values) and Excel spreadsheets. This allows you to easily incorporate your existing data into the application for analysis. +* **Project-Based Data Management:** To streamline your research, BN Modeller utilizes a project-based system. This allows you to organize and manage multiple datasets within a single project, preserving the state of your work and facilitating easy switching between different analyses. +* **Bayesian Network Construction via Correlation Coefficients:** BN Modeller allows you to build and visualize Bayesian Networks based on statistical correlation measures. Specifically, you can utilize Pearson's correlation coefficient (measuring linear relationships), Spearman's rank correlation coefficient (measuring monotonic relationships), or partial correlation coefficients (accounting for the influence of other variables). A brief explanation of correlation coefficients is provided on the page [Understanding Correlation](./understanding-correlation.html). +* **Correlation Evaluation:** The application provides tools to evaluate the strength and significance of correlations between variables. This allows you to identify potential dependencies and inform the structure of your Bayesian Network. +* **Manual Dependency Specification:** While BN Modeller can suggest potential dependencies based on correlation analysis, you retain full control over the network structure. You can manually select and specify the dependencies between variables, allowing you to incorporate domain expertise and refine the model. +* **Bayesian Network Visualization and Export:** BN Modeller allows you to export your constructed Bayesian Networks as image files in various formats, including PNG and SVG. This enables you to easily share your findings and incorporate the visualizations into reports and presentations. + +## Getting started + +This section will guide you through the initial setup and installation process. Choose the method that best suits your environment and technical expertise. + +### 1. Installation via pip (Recommended for Python Users) + +If you have Python installed on your system, we recommend using `pip`, the Python package installer, to install BN Modeller. + +* **Prerequisites:** Ensure you have Python 3.7 or higher installed. You can download Python from [https://www.python.org/downloads/](https://www.python.org/downloads/). +* **Installation Command:** Open your terminal or command prompt and run the following command: + + ```bash + pip install bn-modeller + ``` + +* **Verification:** After the installation completes, you can verify that BN Modeller is installed correctly by running the following command in your terminal: + + ```bash + bn_modeller --version + ``` + +### 2. Installation using the Windows Executable** + +For users who prefer not to use Python or are on Windows, a pre-built executable file is available. + +* **Download:** You can download the latest Windows executable from the [BN Modeller GitHub Releases page](https://github.com/Digiratory/bayes_model/releases). +* **Installation:** There is no installation process; simply download and run the `.exe` file. +* **Note:** The executable includes all necessary dependencies and does not require a separate Python installation. + +**Next Steps:** + +Once BN Modeller is installed, you can explore the application's features and begin building your Bayesian Networks. Refer to the [User Guide](./user-guide/index.html) for detailed instructions on using the software. + +## Citations + +If you use BN Modeller in your research or work, please consider citing it as follows: + +```bibtex + +``` diff --git a/docs/understanding-correlation.md b/docs/understanding-correlation.md new file mode 100644 index 0000000..aee667b --- /dev/null +++ b/docs/understanding-correlation.md @@ -0,0 +1,35 @@ +# Understanding Correlation Coefficients + +BN Modeller utilizes several correlation coefficients to help you identify potential dependencies between variables when constructing Bayesian Networks. Here's a brief explanation of each: + +## What is Correlation? + +Correlation measures the strength and direction of a linear relationship between two variables. A positive correlation means that as one variable increases, the other tends to increase as well. A negative correlation means that as one variable increases, the other tends to decrease. A correlation close to zero suggests little or no linear relationship. + +## 1. Pearson's Correlation Coefficient (r) + +* **What it measures:** Pearson's correlation coefficient (often denoted as 'r') measures the *linear* relationship between two continuous variables. It assesses how well the data points cluster around a straight line. +* **Range:** The value of 'r' ranges from -1 to +1. + * +1 indicates a perfect positive linear correlation. + * -1 indicates a perfect negative linear correlation. + * 0 indicates no linear correlation. +* **Assumptions:** Pearson's correlation assumes that the data is normally distributed and that the relationship between the variables is linear. +* **Example:** A positive Pearson's correlation between drug dosage and patient recovery time might suggest that higher dosages are associated with faster recovery. + +## 2. Spearman's Rank Correlation Coefficient (ρ) + +* **What it measures:** Spearman's rank correlation coefficient (often denoted as 'ρ' - rho) measures the *monotonic* relationship between two variables. A monotonic relationship means that as one variable increases, the other tends to increase (or decrease) consistently, but not necessarily in a straight line. +* **Range:** Like Pearson's correlation, Spearman's rank correlation ranges from -1 to +1. +* **Advantages:** Spearman's rank correlation is less sensitive to outliers and does not require the assumption of normality. +* **Example:** A positive Spearman's rank correlation between gene expression level and disease severity might suggest that higher gene expression is associated with more severe disease, even if the relationship isn't perfectly linear. + +## 3. Partial Correlation + +* **What it measures:** Partial correlation measures the correlation between two variables while *controlling for* the influence of one or more other variables. It helps to isolate the direct relationship between the variables of interest. +* **Why it's useful:** Sometimes, two variables appear to be correlated simply because they are both influenced by a third variable. Partial correlation helps to remove this confounding effect. +* **Example:** You might observe a correlation between patient age and hospital readmission rate. However, this correlation might be influenced by the presence of other factors, such as the severity of the patient's condition. Partial correlation can be used to assess the correlation between age and readmission rate while controlling for the effect of disease severity. + +## Important Notes + +* Correlation does not imply causation. Just because two variables are correlated does not mean that one causes the other. +* Always consider the context of your data and the assumptions of each correlation coefficient when interpreting the results. diff --git a/docs/user-guide/data-analysis-workflow.md b/docs/user-guide/data-analysis-workflow.md new file mode 100644 index 0000000..ffb4cf2 --- /dev/null +++ b/docs/user-guide/data-analysis-workflow.md @@ -0,0 +1,41 @@ +# Data Analysis Workflow + +After loading your data into BN Modeller, you can proceed with data analysis and model building. This section outlines the steps involved in this process. + +## Step 1: Evaluating Variable Correlations + +Before proceeding to model building, it's important to evaluate the correlations between variables. This helps you understand how different variables interact and can guide the selection of relevant variables for the model. + +![Evaluating Variable Correlations](/bayes_model/assets/img/Diagrams-Usage-Workflow-1.png) + +The figure above shows an example of the Pair-wise Correlation Evaluation page. This page provides a visual assessment of the relationships between your variables. + +**Area #1** contains a checkbox list for selecting which variables to include in the evaluation. You can select multiple variables by checking their corresponding boxes. This allows you to focus on specific relationships without cluttering the view with unnecessary data. **Note:** this selection does not affect the actual data used in the analysis; it only controls which variables are displayed on this page. + +**Area #2** displays a grid of pair-plots. Each plot shows the relationship between two variables using scatter plots. This allows you to visually identify potential dependencies. The screenshot above illustrates an example of this view. Each small dot represents a single data point for the two variables being compared. The plots on the diagonal are histograms showing the distribution of each variable. + +You can return to this page at any time by clicking the corresponding tab in the application. + +## Step 2: Selecting Relevant Variables and Their Relationships + +After evaluating the correlations, you may want to select a subset of variables that are most relevant for your analysis. This is performed in the "Bayesian Network -> Dependencies" tab. + +![Selecting Relevant Variables and Their Relationships](/bayes_model/assets/img/Diagrams-Usage-Workflow-2.png) + +The figure above shows the window where you can select which variables are relevant for your analysis. You can also see a list of all available variables and their relationships with other variables. + +The selection process involves checking the boxes next to the variable names in the list on the left-hand side of the screen (**Area #3**). Once you have selected your relevant variables, the table on the right-hand side (**Area #4**) will update to show only the relationships between the selected variables. + +Dependencies are defined by the expert using checkboxes in the right-hand side table (**Area #4**). These dependencies are then used to construct the Bayesian Network structure. The selected checkboxes represent the conditional probabilities that the variable in the column is dependent on the variable in the row. + +## Step 3: Constructing the Bayesian Network Structure + +After selecting the relevant variables and their relationships, you can proceed to construct the Bayesian Network structure. This step involves creating a graphical representation of the dependencies between the selected variables. The graphical representation helps in understanding the conditional probabilities and how they affect each other. + +![Constructing the Bayesian Network Structure](/bayes_model/assets/img/Diagrams-Usage-Workflow-3.png) + +To construct the Bayesian Network structure, open the **Bayesian Network -> Visualization** tab. Here, you will see a canvas (**Area #5**) with Bayesian Network nodes and edges. + +Using the tools in **Area #6**, you can select the type of correlation matrix used to evaluate the variables' correlation. You can also adjust the threshold for the correlation matrix to filter out weak correlations. The visualization will update automatically based on your selection. + +Once you have constructed the Bayesian Network structure, you can save it as a file or export it for further analysis. diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md new file mode 100644 index 0000000..de958ff --- /dev/null +++ b/docs/user-guide/index.md @@ -0,0 +1,132 @@ +# User Guide - Welcome! + +This User Guide provides comprehensive instructions and explanations for using BN Modeller. Whether you're a novice or an experienced Bayesian network modeler, this guide will help you leverage the software's features to build, analyze, and visualize your networks. + +## Table of Contents + +* [Getting Started](#getting-started) + * [Installation BN Modeller](#installation-bn-modeller) + * [Launching BN Modeller](#launching-bn-modeller) + * [Understanding the Interface and workflow](#understanding-the-interface-and-workflow) + +* [Troubleshooting](#troubleshooting) +* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) + +--- + +## Getting Started + +### Installation BN Modeller + +#### 1. Installation via pip (Recommended for Python Users) + +If you have Python installed on your system, we recommend using `pip`, the Python package installer, to install BN Modeller. + +* **Prerequisites:** Ensure you have Python 3.7 or higher installed. You can download Python from [https://www.python.org/downloads/](https://www.python.org/downloads/). +* **Installation Command:** Open your terminal or command prompt and run the following command: + + ```bash + pip install bn-modeller + ``` + +* **Verification:** After the installation completes, you can verify that BN Modeller is installed correctly by running the following command in your terminal: + + ```bash + bn_modeller --version + ``` + +#### 2. Installation using the Windows Executable** + +For users who prefer not to use Python or are on Windows, a pre-built executable file is available. + +* **Download:** You can download the latest Windows executable from the [BN Modeller GitHub Releases page](https://github.com/Digiratory/bayes_model/releases). +* **Installation:** There is no installation process; simply download and run the `.exe` file. +* **Note:** The executable includes all necessary dependencies and does not require a separate Python installation. + +### Launching BN Modeller + +* **Windows, exe-based distribution:** Double-click the BN Modeller executable file. +* **Python-based distribution (e.g., using pip):** Open a terminal or command prompt and run: + +```bash + bn_modeller +``` + +### Understanding the Interface and workflow + +When you launch BN Modeller, you'll be greeted with a dialog box that guides you through the initial setup. From there, the application presents a series of interconnected views, each designed for a specific stage of the Bayesian network creation process. Let's walk through each of these views. + +Navigation: Use the tabs or menu options to navigate between these different pages. +Experimentation: Don's be afraid to experiment with different settings and options to see how they affect the network structure and visualization. + +#### 1. Project Selection and Initialization + +![Project Selection Dialog](/bayes_model/assets/img/startup_dialog_1.png) + +Upon startup, the Project Selection Dialog appears. This dialog allows you to either: + +Open an Existing Project: Select a previously saved project from the list. This will load the data and any existing network structure. +Create a New Project: Choose this option to start a new project from scratch. You'll be prompted to specify a project name and location. + +Detailed instructions on how to use this dialog are provided on the page [Project Selection](/user-guide/project_selection.html). + +#### 2. Evaluation of Variables Correlation + +![Evaluation of Variables Correlation](/bayes_model/assets/img/evaluation_of_var_corr.png) + +After selecting or creating a project and importing data, you'll be taken to the Pair-wise Correlation Evaluation page. This page provides a visual assessment of the relationships between your variables. + +Variable selection: You can select which variables to include in the evaluation by checking the corresponding boxes. This allows you to focus on specific relationships without cluttering the view with unnecessary data. **Note:** this selection does not affect the actual data used in the analysis; it only controls which variables are displayed on this page. + +Pair-Plots: This page displays a grid of pair-plots. Each plot shows the relationship between two variables using scatter plots. This allows you to visually identify potential dependencies. The screenshot abowe illustrates an example of this view. Each small dot represents a single data point for the two variables being compared. + +Interpretation: Examine the plots for patterns and trends. Strong correlations (linear or non-linear) will appear as clusters or clear trends in the dots. For example, if the dots generally move upwards and to the right, it suggests a positive correlation. Conversely, a downward trend indicates a negative correlation. The absence of a clear pattern suggests a weak or no correlation. + +#### 3. Bayesian Network Page + +![Bayesian Network Setup Page](/bayes_model/assets/img/bn_setup_page.png) + +The Bayesian Network page is the core of the network construction process. This page allows you to define the structure of your Bayesian network. + +The interface is organized into a grid-like structure, primarily displaying a correlation matrix. It's designed to allow for a visual assessment of relationships between variables. + +Key Sections & Elements: + +**Variable Selection (Left Side).** There is a list of variables. These lists likely allow the user to select a variable to use in Bayesian Network construction. + +**Correlation Matrix (Central Area).** + +* Rows & Columns: The core of the interface. Each row and column represents a variable in the dataset. +* Cells: Each cell within the matrix displays a correlation coefficient between two variables. The value indicates the Pearson and Partial correlation oefficients. By checking a box, you are indicating that the variable on the column and is dependent on the variable on the raw. This creates a directed edge in your Bayesian network. Checkboxes allow you to manually specify dependencies based on expert knowledge. +* Color Coding: The cells are color-coded. This uses a gradient (e.g., blue for positive correlation, red for negative correlation, white/neutral for weak r no correlation). This visual cue helps quickly identify strong correlations. +* Variable Labels: The rows and columns are labeled with the names of the variables. + +#### 4. Bayesian Network Visualization Page + +![Bayesian Network Visualization Page](/bayes_model/assets/img/bn_viz_page.png) + +The Bayesian Network Visualization page provides a graphical representation of your network. + +**Visualization Toolbar:** + +* Zoom Controls: Buttons for zooming in and out of the network. +* Pan Controls: Buttons for panning (moving) the view of the network. +* Bayesian Network visualization export button: Allows you to export the current view of the Bayesian Network as an image or other format. + +**Network Graph:** The main area of the page displays the Bayesian network as a graph, with nodes representing variables and edges representing dependencies. + +**Correlation Selection:** You can select which type of correlation is used to construct the network. Options may include: + +* Pearson's Correlation +* Spearman's Rank Correlation +* Partial Correlation + +**Threshold Adjustment:** A slider or input field allows you to adjust the threshold for edge visualization. This controls which dependencies are displayed as edges in the network graph. Lower thresholds show more edges, while higher thresholds show fewer edges. + +## Troubleshooting + +TBD + +## Frequently Asked Questions (FAQ) + +TBD diff --git a/docs/whatsnew.md b/docs/whatsnew.md new file mode 100644 index 0000000..e69de29 diff --git a/notebooks/Diagrams.drawio b/notebooks/Diagrams.drawio new file mode 100644 index 0000000..30c6734 --- /dev/null +++ b/notebooks/Diagrams.drawio @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +