(no commit message)
[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             System.out.println("REDE: " + redeEntity.getArquivo());
40             rede = new ProbabilisticNetwork(null);
41             XMLBIFIO.loadXML(new File(redeEntity.getArquivo()), rede);
42
43         } catch (Exception e) {
44             e.printStackTrace();
45             System.exit(1);
46         }
47         
48         compilar();
49     }
50     
51     public static UnBUtil getInstance(Rede redeEntity) {
52         if (unBUtil == null) 
53             unBUtil = new UnBUtil(redeEntity);
54         
55         return unBUtil;
56     }
57
58     public ProbabilisticNode getNodeByName(String name) {
59         for(Node node : rede.getNodes()) {
60             if (node.getName().equals(name))
61                 return (ProbabilisticNode) node;
62         }
63         
64         return null;
65     }
66
67     public NodoBean getNodoBeanByNodo(Nodo nodo) {
68         for(Node node : rede.getNodes()) {
69             if (node.getName().equals(nodo.getNome()))
70                 return new NodoBean(nodo, (ProbabilisticNode) node);
71         }
72         
73         return null;
74     }
75     
76     public ProbabilisticNetwork getRede() {
77         return rede;
78     }
79
80     public void compilar() {
81         JunctionTreeAlgorithm jt = new JunctionTreeAlgorithm();
82         jt.setNet(rede);            
83         jt.run();
84     }
85     
86     public void setProbablidadeNodo(ProbabilisticNode pn, float sim, float nao) {
87         float likelihood[] = new float[pn.getStatesSize()]; //nr. de estados do nodo
88         likelihood[0] = sim;
89         likelihood[1] = nao;
90
91         pn.addLikeliHood(likelihood);
92         try {
93             unBUtil.getRede().updateEvidences();
94         } catch (Exception e) {
95             e.printStackTrace();
96         }       
97     }
98     
99     public void ativarNodo(ProbabilisticNode pn) {
100         setProbablidadeNodo(pn, 1f, 0.0f);
101     }
102
103     public void desativarNodo(ProbabilisticNode pn) {
104         setProbablidadeNodo(pn, 0.0f, 1f);
105     }
106     
107     public List<NodoBean> getProbabilidadeNodos(String tipo) {
108         EntityManager em = DbUtil.getInstance().getEntityManager();
109         List<NodoBean> nodos = new ArrayList<NodoBean>();
110         
111         for (int j = 0; j < rede.getNodeCount(); j++) {
112             ProbabilisticNode nodoAtual = (ProbabilisticNode) rede.getNodeAt(j);
113
114             
115             Nodo nodo = (Nodo) em.createQuery("From Nodo where nome=:pNome")
116                           .setParameter("pNome", nodoAtual.getName())
117                           .getSingleResult();
118             
119             
120             if (!nodo.getTipo().equals(tipo))
121                 continue;
122             
123             nodos.add(new NodoBean(nodo, nodoAtual));                  
124         }
125
126         Collections.sort(nodos, new Comparator() {
127             @Override
128             public int compare(Object o1, Object o2) {
129                 NodoBean nodo1 = (NodoBean) o1;
130                 NodoBean nodo2 = (NodoBean) o2;
131                 
132                 if (nodo1.getProbabilidade() < nodo2.getProbabilidade())
133                     return 1;
134                 else if (nodo1.getProbabilidade() > nodo2.getProbabilidade())
135                     return -1;
136                 else
137                     return 0;
138             }
139         });
140
141         return nodos;
142     }
143
144     public List<NodoBean> getProbabilidadeDiagnosticos() {
145         return getProbabilidadeNodos(Nodo.DIAGNOSTICO);
146     }
147
148     public List<NodoBean> getProbabilidadeCondutas() {
149         return getProbabilidadeNodos(Nodo.CONDUTA);
150     }
151     
152     public void print() {
153             for (int j = 0; j < rede.getNodeCount(); j++) {
154                 ProbabilisticNode nodoAtual = (ProbabilisticNode) rede.getNodeAt(j);
155                 System.out.println(nodoAtual.getName());
156                 
157                 // Verificando a tabela de probabilidades do nodo
158                  for (int pb = 0; pb < nodoAtual.getStatesSize(); pb++) {
159                          System.out.println(nodoAtual.getStateAt(pb)+":"+nodoAtual.getMarginalAt(pb));
160                  }
161                  System.out.println("");
162             }
163     }
164 }