Nova versao do simulador e tratamento de erros das chamadas.
[simdecs2.git] / src / java / org / ufcspa / simdecs / util / UnBUtil.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5 package org.ufcspa.simdecs.util;
6
7 import java.io.File;
8 import java.util.ArrayList;
9 import java.util.Collections;
10 import java.util.Comparator;
11 import java.util.List;
12 import javax.persistence.EntityManager;
13 import org.ufcspa.simdecs.entities.Nodo;
14 import org.ufcspa.simdecs.entities.Rede;
15 import unbbayes.io.xmlbif.version6.XMLBIFIO;
16 import unbbayes.prs.Node;
17 import unbbayes.prs.bn.JunctionTreeAlgorithm;
18 import unbbayes.prs.bn.ProbabilisticNetwork;
19 import unbbayes.prs.bn.ProbabilisticNode;
20
21 /**
22  *
23  * @author maroni
24  */
25 public class UnBUtil {
26
27     
28     private static UnBUtil unBUtil;
29     private ProbabilisticNetwork rede;
30     
31     private UnBUtil(Rede redeEntity) {
32         abreRede(redeEntity);
33     }
34     
35     public final void abreRede(Rede redeEntity) {
36         try {
37             // required to run unbbayes gui classes on server
38             System.setProperty("java.awt.headless", "false"); 
39             rede = new ProbabilisticNetwork(null);
40             XMLBIFIO.loadXML(new File(redeEntity.getArquivo()), rede);
41
42         } catch (Exception e) {
43             e.printStackTrace();
44             System.exit(1);
45         }
46         
47         compilar();
48     }
49     
50     public static UnBUtil getInstance(Rede redeEntity) {
51         if (unBUtil == null) 
52             unBUtil = new UnBUtil(redeEntity);
53         
54         return unBUtil;
55     }
56
57     public ProbabilisticNode getNodeByName(String name) {
58         for(Node node : rede.getNodes()) {
59             if (node.getName().equals(name))
60                 return (ProbabilisticNode) node;
61         }
62         
63         return null;
64     }
65
66     public NodoBean getNodoBeanByNodo(Nodo nodo) {
67         for(Node node : rede.getNodes()) {
68             if (node.getName().equals(nodo.getNome()))
69                 return new NodoBean(nodo, (ProbabilisticNode) node);
70         }
71         
72         return null;
73     }
74     
75     public ProbabilisticNetwork getRede() {
76         return rede;
77     }
78
79     public void compilar() {
80         JunctionTreeAlgorithm jt = new JunctionTreeAlgorithm();
81         jt.setNet(rede);            
82         jt.run();
83     }
84     
85     public void setProbablidadeNodo(ProbabilisticNode pn, float sim, float nao) {
86         float likelihood[] = new float[pn.getStatesSize()]; //nr. de estados do nodo
87         likelihood[0] = sim;
88         likelihood[1] = nao;
89
90         pn.addLikeliHood(likelihood);
91         try {
92             unBUtil.getRede().updateEvidences();
93         } catch (Exception e) {
94             e.printStackTrace();
95         }       
96     }
97     
98     public void ativarNodo(ProbabilisticNode pn) {
99         setProbablidadeNodo(pn, 1f, 0.0f);
100     }
101
102     public void desativarNodo(ProbabilisticNode pn) {
103         setProbablidadeNodo(pn, 0.0f, 1f);
104     }
105     
106     public List<NodoBean> getProbabilidadeNodos(String tipo) {
107         EntityManager em = DbUtil.getInstance().getEntityManager();
108         List<NodoBean> nodos = new ArrayList<NodoBean>();
109         
110         for (int j = 0; j < rede.getNodeCount(); j++) {
111             ProbabilisticNode nodoAtual = (ProbabilisticNode) rede.getNodeAt(j);
112
113             
114             Nodo nodo = (Nodo) em.createQuery("From Nodo where nome=:pNome")
115                           .setParameter("pNome", nodoAtual.getName())
116                           .getSingleResult();
117             
118             
119             if (!nodo.getTipo().equals(tipo))
120                 continue;
121             
122             nodos.add(new NodoBean(nodo, nodoAtual));                  
123         }
124
125         Collections.sort(nodos, new Comparator() {
126             @Override
127             public int compare(Object o1, Object o2) {
128                 NodoBean nodo1 = (NodoBean) o1;
129                 NodoBean nodo2 = (NodoBean) o2;
130                 
131                 if (nodo1.getProbabilidade() < nodo2.getProbabilidade())
132                     return 1;
133                 else if (nodo1.getProbabilidade() > nodo2.getProbabilidade())
134                     return -1;
135                 else
136                     return 0;
137             }
138         });
139
140         return nodos;
141     }
142
143     public List<NodoBean> getProbabilidadeDiagnosticos() {
144         return getProbabilidadeNodos(Nodo.DIAGNOSTICO);
145     }
146
147     public List<NodoBean> getProbabilidadeCondutas() {
148         return getProbabilidadeNodos(Nodo.CONDUTA);
149     }
150     
151     public void print() {
152             for (int j = 0; j < rede.getNodeCount(); j++) {
153                 ProbabilisticNode nodoAtual = (ProbabilisticNode) rede.getNodeAt(j);
154                 System.out.println(nodoAtual.getName());
155                 
156                 // Verificando a tabela de probabilidades do nodo
157                  for (int pb = 0; pb < nodoAtual.getStatesSize(); pb++) {
158                          System.out.println(nodoAtual.getStateAt(pb)+":"+nodoAtual.getMarginalAt(pb));
159                  }
160                  System.out.println("");
161             }
162     }
163 }