00001 /* 00002 * Copyright 2007, 2008 Ernesto Coutinho Colla 00003 * 00004 * "BN Parallel Package" é um nome que identifica o conjunto de programas 00005 * que forma uma biblioteca de rotinas que foram desenvolvidas como parte da 00006 * dissertação de mestrado do autor em Ciências da Computação. 00007 * 00008 * O conjunto de programas foi integralmente desenvolvido pelo autor e está 00009 * disponível sob a licença GPL (GNU General Public License). O entendimento 00010 * integral dos termos da licença GPL é condição necessária para a utilização 00011 * parcial ou integral de qualquer parte deste conjunto de programas. 00012 * 00013 * This file is part of BN Parallel Package. 00014 * 00015 * BN Parallel Package is free software: you can redistribute it and/or modify 00016 * it under the terms of the GNU General Public License as published by 00017 * the Free Software Foundation, either version 3 of the License. 00018 * 00019 * BN Parallel Package is distributed in the hope that it will be useful, 00020 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00021 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00022 * GNU General Public License for more details. 00023 * 00024 * You should have received a copy of the GNU General Public License 00025 * along with BN Parallel Package. If not, see <http://www.gnu.org/licenses/>. 00026 */ 00027 00028 00029 /*! 00030 * @file BNLoader.h 00031 * @author Ernesto Colla (ernesto@gmail.com) 00032 * @version 0.0.1 00033 * @date Junho/2007 (2007-06-09) 00034 * @brief Pacote com a função para ler e interpertar o arquivo com a definição de Rede bayesiana (BN: \e Bayesian \e Network). 00035 * 00036 * @todo 00037 * -# Checar eventual memory leak 00038 */ 00039 00040 #ifndef BNLOADER_H 00041 #define BNLOADER_H 00042 00043 /* Includes */ 00044 #include <string.h> 00045 00046 /* Bibliotecas específicas */ 00047 #include "BNMain.h" 00048 #include "singlelinkedlist.h" 00049 #include "hash.h" 00050 00051 /* Defines */ 00052 00053 #define STATE_NOT_DEFINED 0 //!< Constante para estado não definido. 00054 #define STATE_FINISHED 1 //!< Constante para indicar que o parser do arquivo foi concluído. 00055 #define STATE_BIF 2 //!< Constante para indicar que iniciou o parser da definição da Rede Bayesiana. 00056 #define STATE_NETWORK 3 //!< Constante para indicar que iniciou o parser da Rede Bayesiana. 00057 #define STATE_VARIABLE 4 //!< Constante para indicar que o parser esta analisando uma TAG que define uma variável. 00058 #define STATE_PROBABILITY 5 //!< Constante para indicar que o parser esta analisando uma TAG que define um potencial (ou probabilidade). 00059 #define STATE_QUERY 6 //!< Constante para indicar que o parser esta analisando o conteúdo de uma TAG 'QUERY'. 00060 #define STATE_EVIDENCES 7 //!< Constante para indicar que o parser esta analisando o conteúdo de uma TAG 'EVIDENCES'. 00061 #define STATE_COMMENT 8 //!< Constante para indicar que o parser esta percorrendo um comentário. 00062 00063 #define TAG_BIF "BIF" //!< TAG que inicia o conteúdo XML para a definição de uma Rede Bayesiana. 00064 #define TAG_NETWORK "NETWORK" //!< TAG que inicia a definição de uma Rede Bayesiana propriamente dita. 00065 #define TAG_NAME "NAME" //!< TAG para nome de diversas estruturas de dados. 00066 #define TAG_VARIABLE "VARIABLE" //!< TAG para definição de uma variável. 00067 #define TAG_VALUE "VALUE" //!< TAG para definição dos valores dos estados das variáveis (alternativa para TAG_OUTCOME). 00068 #define TAG_OUTCOME "OUTCOME" //!< TAG para definição dos valores dos estados das variáveis (alternativa para TAG_VALUE). 00069 #define TAG_TYPE "TYPE" //!< TAG que indica o tipo da variável. 00070 #define TAG_PROBABILITY "PROBABILITY" //!< TAG para definição dos potenciais (alternativa para TAG_DEFINITION). 00071 #define TAG_DEFINITION "DEFINITION" //!< TAG para definição dos potenciais (alternativa para TAG_PROBABILITY). 00072 #define TAG_FOR "FOR" //!< TAG que indica a variável "condicionada" nos potenciais. 00073 #define TAG_GIVEN "GIVEN" //!< TAG que indica as variáveis "condicionadoras" nos potenciais. 00074 #define TAG_TABLE "TABLE" //!< TAG para a definição da tabela com a distribuição de probabilidades. 00075 #define TAG_QUERY "QUERY" //!< TAG para a definição das variáveis questionadas \e Query \e Variables. 00076 #define TAG_EVIDENCES "EVIDENCES" //!< TAG para definir umam variável observada e o seu respectivo estado observado. 00077 00078 #define TYPE_DISCRETE "DISCRETE" //!< Constante para identificar variável discreta. 00079 #define TYPE_CONTINUOUS "CONTINUOUS" //!< Constante para identificar variável contínua. 00080 00081 #define MAX_LINE_LENGTH 8192 //!< Tamanho máximo da linha que pode ser lida. 00082 #define MAX_TAG_LENGTH 1024 //!< Tamanho máximo da TAG utilizada para identificar as partes do arquivo. 00083 #define MAX_TAGVALUE_LENGTH 8192 //!< Tamanho máximo do conteúdo de uma TAG. 00084 00085 #define MAX_POTENTIAL_VALUES 4096 //!< Número máximo de valores que pode ser lido para um potencial. 00086 00087 /*! 00088 * @brief Carrega a definição de uma Rede Bayesiana a partir de um arquivo com formato predefinido 00089 * @param[in] filename Nome do arquivo que define a Rede Bayesiana. 00090 * @return Ponteiro para a Rede Bayesiana construída a partir do arquivo. 00091 */ 00092 BayesNet* bnload(char* filename); 00093 00094 /*! 00095 * @brief Carrega de uma arquivo com formato predefinido as variáveis questionadas (\e Query \e Variables) 00096 * sobre as quais se deseja fazer a inferência. 00097 * @param[out] nxq Ponteiro para um inteiro com o número de elementos do \e array de \e ids das \e Query \e Variables. 00098 * @param[in] filename Nome do arquivo no qual estão definidas as \e Query \e Variables. 00099 * @param[in] bayesnet Rede Bayesiana sobre a qual será feita a inferência. 00100 * @return \e Array com os \e ids das \e Query \e Variables. 00101 */ 00102 00103 int* bnloadquery(int* nxq, char* filename, BayesNet* bayesnet); 00104 00105 /*! 00106 * @brief Carrega de uma arquivo com formato predefinido as variáveis observadas (\e Evidence) e os respectios estados observados (\e findings) 00107 * sobre as quais se deseja fazer a inferência. 00108 * @param[out] nxe Ponteiro para um inteiro com o número de elementos do \e array de \e ids das variáveis observadas. 00109 * @param[out] findings Potenciais que indicam os estados observados das variáveis. 00110 * @param[in] filename Nome do arquivo no qual estão definidas as variáveis observadas e os seus respectivos estados. 00111 * @param[in] bayesnet Rede Bayesiana sobre a qual será feita a inferência. 00112 * @return \e Array com os \e ids das variáveis observadas. 00113 */ 00114 00115 int* bnloadevidences(int* nxe, Potential** findings, char* filename, BayesNet* bayesnet); 00116 00117 #endif