Nova versao do simulador e tratamento de erros das chamadas.
[simdecs2.git] / src / java / org / ufcspa / simdecs / util / UnBBayesUtil.java
CommitLineData
25aea581 1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package org.ufcspa.simdecs.util;
6
7import java.io.File;
8import java.security.InvalidParameterException;
9import java.util.*;
56f36e0a 10import javax.persistence.EntityManager;
11import org.ufcspa.simdecs.entities.Nodo;
12import org.ufcspa.simdecs.entities.NodoPaciente;
13import org.ufcspa.simdecs.entities.Paciente;
25aea581 14import org.ufcspa.simdecs.entities.Rede;
15import org.ufcspa.simdecs.exceptions.InvalidNodeState;
16import unbbayes.io.xmlbif.version6.XMLBIFIO;
17import unbbayes.prs.Node;
18import unbbayes.prs.bn.JunctionTreeAlgorithm;
19import unbbayes.prs.bn.ProbabilisticNetwork;
20import unbbayes.prs.bn.ProbabilisticNode;
21import unbbayes.prs.bn.TreeVariable;
22
23/**
24 *
25 * @author maroni
26 */
27public class UnBBayesUtil {
28
29
30 private ProbabilisticNetwork rede;
31
32 public UnBBayesUtil(Rede redeEntity) throws Exception {
33 abreRede(redeEntity);
34 }
35
36 public final void abreRede(Rede redeEntity) throws Exception {
77e00f06 37System.out.println(redeEntity);
38if (redeEntity != null)
39 System.out.println("NOME DA REDE A ABRIR: " + redeEntity.getArquivo());
25aea581 40 // required to run unbbayes gui classes on server
41 System.setProperty("java.awt.headless", "false");
dfca7926 42System.out.println("PONTO 1");
050a5e2a 43// rede = new ProbabilisticNetwork("rede"+redeEntity.getId());
7870db59 44
dfca7926 45System.out.println("PONTO 2");
25aea581 46 XMLBIFIO.loadXML(new File(redeEntity.getArquivo()), rede);
dfca7926 47System.out.println("PONTO 3");
25aea581 48
49 compilar();
dfca7926 50System.out.println("PONTO 4");
25aea581 51 }
52
53 public void compilar() {
54 JunctionTreeAlgorithm jt = new JunctionTreeAlgorithm();
55 jt.setNet(rede);
56 jt.run();
57 }
58
59
60 public Node getNodeByName(String nodeName) {
61 for(Node node : rede.getNodes()) {
62 if (node.getName().toLowerCase().equals(nodeName.toLowerCase()))
63 return node;
64 }
65
66 return null;
67 }
68
69
70 public void setNodeState(ProbabilisticNode node, Object ... stateProbs) throws Exception {
71 HashMap<String, Float> states = new HashMap<String, Float>();
72 String state = null;
73 Float probability = null;
74
75 for (Object stateProb : stateProbs) {
76 if (state == null)
77 if (stateProb instanceof String)
78 state = (String) stateProb;
79 else
80 throw new InvalidParameterException("Os parametros devem ser informados no formato: state(string), prob(float), ..., ...");
81 else if (state != null)
82 if ( !(stateProb instanceof String) ) {
83 if (stateProb instanceof Integer)
84 probability = new Float ((Integer) stateProb);
85 else if (stateProb instanceof Float)
86 probability = (Float) stateProb;
87 else
88 throw new InvalidParameterException("Os parametros devem ser informados no formato: state(string), prob(float), ..., ...");
89
90 states.put(state.toLowerCase(), probability);
91 probability = null;
92 state = null;
93 } else
94 throw new InvalidParameterException("Os parametros devem ser informados no formato: state(string), prob(float), ..., ...");
95 }
96
97 float likelihood[] = new float[node.getStatesSize()]; //nr. de estados do nodo
98 for(int i=0; i < node.getStatesSize(); i++) {
99 Float prob = states.get(node.getStateAt(i).toLowerCase());
100 states.remove(node.getStateAt(i).toLowerCase());
101 if (prob != null)
102 likelihood[i] = prob;
103 else
104 likelihood[i] = 0;
105 }
106
107 if (states.size() > 0) {
108 StringBuilder invalidStates = new StringBuilder();
109 for (String key : states.keySet()) {
110 invalidStates.append(key);
111 invalidStates.append(" ");
112 }
113 throw new InvalidNodeState("Estados de nodos inválidos: " + invalidStates);
114 }
115
116 node.addLikeliHood(likelihood);
117 rede.updateEvidences();
118 }
119
120 public List<ProbabilisticBean> getProbabilidades(TreeVariable node) {
121
122 List<ProbabilisticBean> listProbs = new ArrayList<ProbabilisticBean>();
123
124 for (int i=0; i < node.getStatesSize(); i++)
125 listProbs.add(new ProbabilisticBean(node.getStateAt(i), node.getMarginalAt(i)));
126
127 return listProbs;
128 }
129
130 public float getProbabilidadeByState(TreeVariable node, String state) {
131 for (ProbabilisticBean bean : getProbabilidades(node)) {
132 if (state.toLowerCase().equals(bean.getState().toLowerCase()))
133 return bean.getProbability();
134 }
135
136 return 0;
137 }
138
139 public List<ProbabilisticBean> getProbabilidadesAscOrder(TreeVariable node) {
140 List<ProbabilisticBean> listProbs = getProbabilidades(node);
141
142 Collections.sort(listProbs, new Comparator() {
143 @Override
144 public int compare(Object o1, Object o2) {
145 ProbabilisticBean nodo1 = (ProbabilisticBean) o1;
146 ProbabilisticBean nodo2 = (ProbabilisticBean) o2;
147
148 if (nodo1.getProbability() > nodo2.getProbability())
149 return 1;
150 else if (nodo1.getProbability() < nodo2.getProbability())
151 return -1;
152 else
153 return 0;
154 }
155 });
156
157 return listProbs;
158 }
159
160 public List<ProbabilisticBean> getProbabilidadesDescOrder(TreeVariable node) {
161 List<ProbabilisticBean> listProbs = getProbabilidades(node);
162
163 Collections.sort(listProbs, new Comparator() {
164 @Override
165 public int compare(Object o1, Object o2) {
166 ProbabilisticBean nodo1 = (ProbabilisticBean) o1;
167 ProbabilisticBean nodo2 = (ProbabilisticBean) o2;
168
169 if (nodo1.getProbability() > nodo2.getProbability())
170 return -1;
171 else if (nodo1.getProbability() < nodo2.getProbability())
172 return 1;
173 else
174 return 0;
175 }
176 });
177
178 return listProbs;
179 }
180
56f36e0a 181 public static UnBBayesUtil getRedePaciente(EntityManager em, Paciente paciente) throws Exception {
182
183 UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede());
184
185 List<NodoPaciente> nodosPaciente = em.createQuery("From NodoPaciente np Where np.paciente.id=:pPaciente")
186 .setParameter("pPaciente", paciente.getId())
187 .getResultList();
188
189 for(NodoPaciente nodo : nodosPaciente) {
190 ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodo.getNodo().getNome());
191 if (pn != null)
192 unBUtil.setNodeState(pn, "Yes", 1, "Not", 0);
193 }
194
195 return unBUtil;
196 }
25aea581 197
56f36e0a 198 public List<NodoBean> getProbabilidades(EntityManager em, String tipoNodo) {
199 Iterator<Nodo> itNodos = em.createNamedQuery("Nodo.getByTipo")
200 .setParameter("pTipo", tipoNodo)
201 .getResultList().iterator();
202
203 ArrayList nodos = new ArrayList<NodoBean>();
204
205 while(itNodos.hasNext()) {
206 Nodo nodo = itNodos.next();
207 NodoBean nodoBean = new NodoBean(nodo, (Float) getProbabilidadeByState((TreeVariable) getNodeByName(nodo.getNome()), "Yes"));
208 nodos.add(nodoBean);
209 }
210
211 Collections.sort(nodos, new Comparator() {
212 @Override
213 public int compare(Object o1, Object o2) {
214 NodoBean nodo1 = (NodoBean) o1;
215 NodoBean nodo2 = (NodoBean) o2;
216
217 if (nodo1.getProbabilidade() > nodo2.getProbabilidade())
218 return -1;
219 else if (nodo1.getProbabilidade() < nodo2.getProbabilidade())
220 return 1;
221 else
222 return 0;
223 }
224 });
225
226 return nodos;
227 }
228
229 public Nodo getPrimeiroDiagnostico(EntityManager em) {
230 List<NodoBean> diagnosticos = getProbabilidades(em, Nodo.DIAGNOSTICO);
231 for(NodoBean nodoBean : diagnosticos) {
232 return nodoBean.getNodo();
233 }
234
235 return null;
236 }
237
238 public Nodo getSegundoDiagnostico(EntityManager em) {
239 List<NodoBean> diagnosticos = getProbabilidades(em, Nodo.DIAGNOSTICO);
240
241 int d=1;
242 float probabilidadeDiag1=0;
243 float probabilidadeDiag2=0;
244 Nodo segundoDiagnostico=null;
245 for(NodoBean nodoBean : diagnosticos) {
246 if (d == 1)
247 probabilidadeDiag1 = nodoBean.getPercentualProbabilidade();
248 if (d == 2) {
249 probabilidadeDiag2 = nodoBean.getPercentualProbabilidade();
250 segundoDiagnostico = nodoBean.getNodo();
251 }
252
253 if (d++ == 2)
254 break;
255 }
256
257 float diferenca = probabilidadeDiag1 - probabilidadeDiag2;
258 if (diferenca <= 25)
259 return segundoDiagnostico;
260 else
261 return null;
262 }
263
264 public List<Nodo> getCondutas(EntityManager em) {
265 List<NodoBean> condutas = getProbabilidades(em, Nodo.CONDUTA);
266 List<Nodo> condutasRetornar = new ArrayList<Nodo>();
267 for(NodoBean conduta : condutas) {
268 if (conduta.getPercentualProbabilidade() < 50)
269 continue;
270
271 condutasRetornar.add(conduta.getNodo());
272//System.out.println("CONDUTA*: " + conduta.getNodo().getNomeAmigavel());
273 }
274
275 return condutasRetornar;
276
277 }
25aea581 278}