From 56f36e0a1edeb7488659a9264ff0cfc8f309c521 Mon Sep 17 00:00:00 2001 From: maroni Date: Mon, 21 May 2012 01:23:25 -0300 Subject: [PATCH] Nova versao do simulador e tratamento de erros das chamadas. --- src/conf/persistence.xml | 1 + .../ufcspa/simdecs/comunicacao/MetodoFimCaso.java | 16 +- .../simdecs/comunicacao/MetodoGravaHistorico.java | 6 +- .../simdecs/comunicacao/MetodoIniciaCaso.java | 63 ++- .../simdecs/comunicacao/MetodoRegistraAcao.java | 6 +- .../simdecs/entities/IntervencaoPedagogica.java | 4 +- .../org/ufcspa/simdecs/entities/LogPerguntas.java | 149 ++++ .../ufcspa/simdecs/entities/TaticaPedagogica.java | 4 +- .../org/ufcspa/simdecs/mediador/LogExecucao.java | 60 ++- .../simdecs/mediador/NegociacaoPedagogica.java | 779 +++++++++++++------- src/java/org/ufcspa/simdecs/util/UnBBayesUtil.java | 100 +++ web/redes/dinovo.xml | 390 ++++++++++ 12 files changed, 1280 insertions(+), 298 deletions(-) create mode 100644 src/java/org/ufcspa/simdecs/entities/LogPerguntas.java create mode 100644 web/redes/dinovo.xml diff --git a/src/conf/persistence.xml b/src/conf/persistence.xml index 2e3e8ce..9cb2af7 100644 --- a/src/conf/persistence.xml +++ b/src/conf/persistence.xml @@ -21,6 +21,7 @@ org.ufcspa.simdecs.entities.Usuario org.ufcspa.simdecs.entities.TaticaPedagogica org.ufcspa.simdecs.entities.IntervencaoPedagogica + org.ufcspa.simdecs.entities.LogPerguntas true NONE diff --git a/src/java/org/ufcspa/simdecs/comunicacao/MetodoFimCaso.java b/src/java/org/ufcspa/simdecs/comunicacao/MetodoFimCaso.java index fc5c806..49d37e5 100644 --- a/src/java/org/ufcspa/simdecs/comunicacao/MetodoFimCaso.java +++ b/src/java/org/ufcspa/simdecs/comunicacao/MetodoFimCaso.java @@ -6,12 +6,15 @@ package org.ufcspa.simdecs.comunicacao; import java.io.PrintWriter; import java.util.Date; +import java.util.List; import javax.persistence.EntityManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ufcspa.simdecs.entities.Log; +import org.ufcspa.simdecs.entities.Paciente; import org.ufcspa.simdecs.entities.SessaoUsuario; import org.ufcspa.simdecs.entities.TipoEventoLog; +import org.ufcspa.simdecs.mediador.NegociacaoPedagogica; /** * @@ -48,7 +51,18 @@ public class MetodoFimCaso extends BaseComunicacao { out.println(""); - out.println(" "); + List pacientes = em.createQuery("From Paciente where caso.id=:pIdCaso") + .setParameter("pIdCaso", sessaoUsuario.getCaso().getId()) + .getResultList(); + + out.print(" "); + out.println(" " ); out.println(""); } diff --git a/src/java/org/ufcspa/simdecs/comunicacao/MetodoGravaHistorico.java b/src/java/org/ufcspa/simdecs/comunicacao/MetodoGravaHistorico.java index 58e1c1e..cc08784 100644 --- a/src/java/org/ufcspa/simdecs/comunicacao/MetodoGravaHistorico.java +++ b/src/java/org/ufcspa/simdecs/comunicacao/MetodoGravaHistorico.java @@ -13,6 +13,7 @@ import org.ufcspa.simdecs.entities.Log; import org.ufcspa.simdecs.entities.Paciente; import org.ufcspa.simdecs.entities.SessaoUsuario; import org.ufcspa.simdecs.entities.TipoEventoLog; +import org.ufcspa.simdecs.mediador.NegociacaoPedagogica; /** * @@ -60,7 +61,10 @@ public class MetodoGravaHistorico extends BaseComunicacao { // out.println(" "); // out.println(" "); out.println(" " ); - out.println(" "); + NegociacaoPedagogica negociacaoPedagogica = new NegociacaoPedagogica(pIdSessao, paciente); + out.println(""); + out.println(negociacaoPedagogica.getIntervencao(Log.ETAPA_INVESTIGACAO)); + out.println(""); out.println(""); } diff --git a/src/java/org/ufcspa/simdecs/comunicacao/MetodoIniciaCaso.java b/src/java/org/ufcspa/simdecs/comunicacao/MetodoIniciaCaso.java index 4dcd11c..e731569 100644 --- a/src/java/org/ufcspa/simdecs/comunicacao/MetodoIniciaCaso.java +++ b/src/java/org/ufcspa/simdecs/comunicacao/MetodoIniciaCaso.java @@ -115,6 +115,27 @@ public class MetodoIniciaCaso extends BaseComunicacao { return ""; } + + private void registraPerguntaLog(EntityManager em, SessaoUsuario sessaoUsuario, Paciente paciente, Nodo nodo, boolean ativo, String tipoNodo, String pergunta, String nomeAmigavel, String resposta) { + if (!em.getTransaction().isActive()) + em.getTransaction().begin(); + + LogPerguntas logPerguntas = new LogPerguntas(); + logPerguntas.setNodo(nodo); + logPerguntas.setAtivo(ativo); + logPerguntas.setPaciente(paciente); + logPerguntas.setPergunta(pergunta); + logPerguntas.setSessaoUsuario(sessaoUsuario); + logPerguntas.setTipoNodo(tipoNodo); + logPerguntas.setNomeAmigavel(nomeAmigavel); + logPerguntas.setResposta(resposta); + + em.persist(logPerguntas); + em.getTransaction().commit(); + + } + + @Override protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception { @@ -147,7 +168,7 @@ public class MetodoIniciaCaso extends BaseComunicacao { em.getTransaction().commit(); - out.println(""); + // out.println(""); out.println(" "); Iterator itPac = em.createQuery("From Paciente where caso.id=:pIdCaso").setParameter("pIdCaso", caso.getId()).getResultList().iterator(); @@ -165,7 +186,12 @@ public class MetodoIniciaCaso extends BaseComunicacao { continue; } - out.println(" "); + { + String pergunta = getPerguntaNodo(nodo.getNodo().getId()); + String resposta = getRespostaNodo(nodo.getNodo(), paciente); + registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), true, Nodo.SINAL_SINTOMA, pergunta, nodo.getNodo().getNomeAmigavel(), resposta); + out.println(" "); + } } // Sinais e sintomas inativos @@ -175,7 +201,12 @@ public class MetodoIniciaCaso extends BaseComunicacao { continue; } - out.println(" "); + { + String pergunta = getPerguntaNodo(nodo.getId()); + String resposta = getRespostaNodo(nodo, paciente); + registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.SINAL_SINTOMA, pergunta, nodo.getNomeAmigavel(), resposta); + out.println(" "); + } } out.println(" "); @@ -187,7 +218,10 @@ public class MetodoIniciaCaso extends BaseComunicacao { continue; } - out.println(" "); + { + registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_FISICO, null, nodo.getNodo().getNomeAmigavel(), null); + out.println(" "); + } } out.println(" "); @@ -198,7 +232,10 @@ public class MetodoIniciaCaso extends BaseComunicacao { continue; } - out.println(" "); + { + registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_COMPLEMENTAR, null, nodo.getNodo().getNomeAmigavel(), null); + out.println(" "); + } } out.println(" "); /* @@ -221,7 +258,11 @@ public class MetodoIniciaCaso extends BaseComunicacao { Iterator itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator(); while (itDiagnosticos.hasNext()) { Nodo nodo = itDiagnosticos.next(); - out.println(" "); + { + String resposta = getPerguntaNodo(nodo.getId()); + registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.DIAGNOSTICO, null, nodo.getNomeAmigavel(), resposta); + out.println(" "); + } } out.println(" "); @@ -229,7 +270,11 @@ public class MetodoIniciaCaso extends BaseComunicacao { Iterator itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator(); while (itConduta.hasNext()) { Nodo nodo = itConduta.next(); - out.println(" "); + { + String resposta = getPerguntaNodo(nodo.getId()); + registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.CONDUTA, null, nodo.getNomeAmigavel(), resposta); + out.println(" "); + } } out.println(" "); out.println(" "); @@ -237,8 +282,8 @@ public class MetodoIniciaCaso extends BaseComunicacao { out.println(" "); - out.println(" " ); - out.println(""); + // out.println(" " ); + // out.println(""); } } diff --git a/src/java/org/ufcspa/simdecs/comunicacao/MetodoRegistraAcao.java b/src/java/org/ufcspa/simdecs/comunicacao/MetodoRegistraAcao.java index f284af4..0bc0498 100644 --- a/src/java/org/ufcspa/simdecs/comunicacao/MetodoRegistraAcao.java +++ b/src/java/org/ufcspa/simdecs/comunicacao/MetodoRegistraAcao.java @@ -87,12 +87,8 @@ public class MetodoRegistraAcao extends BaseComunicacao { NegociacaoPedagogica negociacaoPedagogica = new NegociacaoPedagogica(pIdSessao, paciente); - out.println(""); -// out.println(" "); - out.println(" "); - - out.println(" " ); + out.println(negociacaoPedagogica.getIntervencao(etapa)); out.println(""); } diff --git a/src/java/org/ufcspa/simdecs/entities/IntervencaoPedagogica.java b/src/java/org/ufcspa/simdecs/entities/IntervencaoPedagogica.java index e993426..08ef3a1 100644 --- a/src/java/org/ufcspa/simdecs/entities/IntervencaoPedagogica.java +++ b/src/java/org/ufcspa/simdecs/entities/IntervencaoPedagogica.java @@ -25,10 +25,10 @@ public class IntervencaoPedagogica implements Serializable { @JoinColumn(name="sessao_id", nullable=false) private SessaoUsuario sessaoUsuario; - @Column(length=30, nullable=false) + @Column(length=100, nullable=false) private String estrategia; - @Column(length=30, nullable=false) + @Column(length=100, nullable=false) private String resultado; @ManyToOne diff --git a/src/java/org/ufcspa/simdecs/entities/LogPerguntas.java b/src/java/org/ufcspa/simdecs/entities/LogPerguntas.java new file mode 100644 index 0000000..8245b6d --- /dev/null +++ b/src/java/org/ufcspa/simdecs/entities/LogPerguntas.java @@ -0,0 +1,149 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.ufcspa.simdecs.entities; + +import java.io.Serializable; +import javax.persistence.*; + +/** + * + * @author maroni + */ +@Entity +@Table(name="LOG_PERGUNTAS") +public class LogPerguntas implements Serializable { + private static final long serialVersionUID = 1L; + @Id + @SequenceGenerator(name="SeqLogPerguntas", sequenceName="SQ_LOG_PERGUNTAS") + @GeneratedValue(strategy = GenerationType.AUTO, generator="SeqLogPerguntas") + private Long id; + + @Column(nullable=false) + private boolean ativo; + + @ManyToOne + @JoinColumn(name="sessao_id", nullable=false) + private SessaoUsuario sessaoUsuario; + + @ManyToOne + @JoinColumn(name="paciente_id", nullable=false) + private Paciente paciente; + + @ManyToOne + @JoinColumn(name="nodo_id", nullable=false) + private Nodo nodo; + + + @Column(name="tipo_nodo", length=100, nullable=false) + private String tipoNodo; + + @Column(name="pergunta", length=2000, nullable=true) + private String pergunta; + + @Column(name="resposta", length=2000, nullable=true) + private String resposta; + + @Column(name="nome_amigavel", length=100, nullable=false) + private String nomeAmigavel; + + public Nodo getNodo() { + return nodo; + } + + public void setNodo(Nodo nodo) { + this.nodo = nodo; + } + + public Paciente getPaciente() { + return paciente; + } + + public void setPaciente(Paciente paciente) { + this.paciente = paciente; + } + + public String getPergunta() { + return pergunta; + } + + public void setPergunta(String pergunta) { + this.pergunta = pergunta; + } + + public SessaoUsuario getSessaoUsuario() { + return sessaoUsuario; + } + + public void setSessaoUsuario(SessaoUsuario sessaoUsuario) { + this.sessaoUsuario = sessaoUsuario; + } + + public String getResposta() { + return resposta; + } + + public void setResposta(String resposta) { + this.resposta = resposta; + } + + public String getTipoNodo() { + return tipoNodo; + } + + public void setTipoNodo(String tipoNodo) { + this.tipoNodo = tipoNodo; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNomeAmigavel() { + return nomeAmigavel; + } + + public void setNomeAmigavel(String nomeAmigavel) { + this.nomeAmigavel = nomeAmigavel; + } + + public boolean isAtivo() { + return ativo; + } + + public void setAtivo(boolean ativo) { + this.ativo = ativo; + } + + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof LogPerguntas)) { + return false; + } + LogPerguntas other = (LogPerguntas) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "org.ufcspa.simdecs.entities.LogPerguntas[ id=" + id + " ]"; + } + +} diff --git a/src/java/org/ufcspa/simdecs/entities/TaticaPedagogica.java b/src/java/org/ufcspa/simdecs/entities/TaticaPedagogica.java index 3fa2013..101d5be 100644 --- a/src/java/org/ufcspa/simdecs/entities/TaticaPedagogica.java +++ b/src/java/org/ufcspa/simdecs/entities/TaticaPedagogica.java @@ -28,10 +28,10 @@ public class TaticaPedagogica implements Serializable { this.id = id; } - @Column(length=30, nullable=false) + @Column(length=100, nullable=false) private String resultado; - @Column(length=30, nullable=false) + @Column(length=100, nullable=false) private String estrategia; @Column(length=200, nullable=false) diff --git a/src/java/org/ufcspa/simdecs/mediador/LogExecucao.java b/src/java/org/ufcspa/simdecs/mediador/LogExecucao.java index 3b9ca65..f9462b1 100644 --- a/src/java/org/ufcspa/simdecs/mediador/LogExecucao.java +++ b/src/java/org/ufcspa/simdecs/mediador/LogExecucao.java @@ -10,10 +10,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; -import org.ufcspa.simdecs.entities.Log; -import org.ufcspa.simdecs.entities.Nodo; -import org.ufcspa.simdecs.entities.TipoEventoLog; +import org.ufcspa.simdecs.entities.*; import org.ufcspa.simdecs.util.DbUtil; +import org.ufcspa.simdecs.util.UnBBayesUtil; +import unbbayes.prs.bn.ProbabilisticNode; /** * @@ -59,10 +59,14 @@ public class LogExecucao { private Map condutas; private List nodosInvestigacao; + private Nodo primeiroDiagnosticoCaso; + private Nodo segundoDiagnosticoCaso; + private List condutasIdeaisDiagnostico; + private EntityManager em; - public final void refresh(long idSessao, long idCaso, long idRede) { + public final void refresh(SessaoUsuario sessaoUsuario, Paciente paciente) throws Exception { // Inicializa Valores perguntasRealizadas = perguntasDisponiveis = perguntasProfessor = perguntasBogusRealizadas = @@ -87,7 +91,7 @@ public class LogExecucao { em = DbUtil.getInstance().getEntityManager(); Iterator itLog = em.createQuery("From Log where sessaoUsuario.id=:pIDSessao order by data") - .setParameter("pIDSessao", idSessao) + .setParameter("pIDSessao", sessaoUsuario.getId()) .getResultList() .iterator(); @@ -181,8 +185,8 @@ public class LogExecucao { } - Iterator itNodoProf = em.createQuery("Select np.nodo From NodoPaciente as np where np.paciente.id in (select p.id from Paciente as p where p.caso.id=:pIDCaso)") - .setParameter("pIDCaso", idCaso) + Iterator itNodoProf = em.createQuery("Select np.nodo From NodoPaciente as np where np.paciente.id=:pIDPaciente") + .setParameter("pIDPaciente", paciente.getId()) .getResultList() .iterator(); while(itNodoProf.hasNext()) { @@ -204,7 +208,7 @@ public class LogExecucao { } Iterator itNodoDisp = em.createQuery("From Nodo where rede.id=:pIDRede") - .setParameter("pIDRede", idRede) + .setParameter("pIDRede", paciente.getRede().getId()) .getResultList() .iterator(); while(itNodoDisp.hasNext()) { @@ -224,10 +228,22 @@ public class LogExecucao { examesFisicosTempoTotal+=nodo.getTempo(); } } + + + if (isConcluiuDiagnostico()) { + UnBBayesUtil redePaciente = UnBBayesUtil.getRedePaciente(em, paciente); + primeiroDiagnosticoCaso=redePaciente.getPrimeiroDiagnostico(em); + segundoDiagnosticoCaso=redePaciente.getSegundoDiagnostico(em); + + if (isConcluiuConduta()) { + redePaciente.setNodeState((ProbabilisticNode)redePaciente.getNodeByName(diagnostico.getNome()), "Yes", 1, "Not", 0); + condutasIdeaisDiagnostico = redePaciente.getCondutas(em); + } + } } - public LogExecucao(long idSessao, long idCaso, long idRede) { - refresh(idSessao, idCaso, idRede); + public LogExecucao(SessaoUsuario sessaoUsuario, Paciente paciente) throws Exception { + refresh(sessaoUsuario, paciente); } public boolean isAbriuFichaPaciente() { @@ -366,6 +382,30 @@ public class LogExecucao { return perguntasRealizadas; } + public List getCondutasIdeaisDiagnostico() { + return condutasIdeaisDiagnostico; + } + + public void setCondutasIdeaisDiagnostico(List condutasIdeaisDiagnostico) { + this.condutasIdeaisDiagnostico = condutasIdeaisDiagnostico; + } + + public Nodo getPrimeiroDiagnosticoCaso() { + return primeiroDiagnosticoCaso; + } + + public void setPrimeiroDiagnosticoCaso(Nodo primeiroDiagnosticoCaso) { + this.primeiroDiagnosticoCaso = primeiroDiagnosticoCaso; + } + + public Nodo getSegundoDiagnosticoCaso() { + return segundoDiagnosticoCaso; + } + + public void setSegundoDiagnosticoCaso(Nodo segundoDiagnosticoCaso) { + this.segundoDiagnosticoCaso = segundoDiagnosticoCaso; + } + @Override diff --git a/src/java/org/ufcspa/simdecs/mediador/NegociacaoPedagogica.java b/src/java/org/ufcspa/simdecs/mediador/NegociacaoPedagogica.java index 12f2a2a..77d428d 100644 --- a/src/java/org/ufcspa/simdecs/mediador/NegociacaoPedagogica.java +++ b/src/java/org/ufcspa/simdecs/mediador/NegociacaoPedagogica.java @@ -6,6 +6,7 @@ package org.ufcspa.simdecs.mediador; import java.util.*; import javax.persistence.EntityManager; +import javax.persistence.NoResultException; import org.ufcspa.simdecs.entities.*; import org.ufcspa.simdecs.util.DbUtil; import org.ufcspa.simdecs.util.NodoBean; @@ -58,6 +59,9 @@ public class NegociacaoPedagogica { private boolean exameComplementarExcessivo = false; private boolean perguntouBogus = false; + private Paciente paciente; + private SessaoUsuario sessaoUsuario; + private void populaEstrategia() throws Exception { // Carrega o endereço do diagrama de influencia do banco e abre a rede no disco @@ -72,121 +76,127 @@ public class NegociacaoPedagogica { exameComplementarExcessivo = false; perguntouBogus = false; - - // Define a probabilidade do nodo Anamnese - { - if (logExecucao.getPerguntasDisponiveis() > 0) { - ProbabilisticNode nodoAnamnese = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Anamnese"); - float pcPerguntasAnamnese = logExecucao.getPerguntasRealizadas() / logExecucao.getPerguntasDisponiveis() * 100; -System.out.println("PERCENTUAL ANAMNESE: " + pcPerguntasAnamnese); - if (pcPerguntasAnamnese <= 20) { - diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); - anamneseInsuficiente = true; - } - else if (pcPerguntasAnamnese > 20 && pcPerguntasAnamnese <= 80) - diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); - else { - diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); - anamneseExcessiva = true; + if (logExecucao.isConcluiuInvestigacao()) { + // Define a probabilidade do nodo Anamnese + { + if (logExecucao.getPerguntasDisponiveis() > 0) { + ProbabilisticNode nodoAnamnese = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Anamnese"); + float pcPerguntasAnamnese = logExecucao.getPerguntasRealizadas() / logExecucao.getPerguntasDisponiveis() * 100; + //System.out.println("PERCENTUAL ANAMNESE: " + pcPerguntasAnamnese); + if (pcPerguntasAnamnese <= 25) { + diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); + anamneseInsuficiente = true; + } + else if (pcPerguntasAnamnese > 25 && pcPerguntasAnamnese <= 75) + diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); + else { + diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); + anamneseExcessiva = true; + } } } - } - - // Define a probabilidade do nodo Exame Fisico - { - if (logExecucao.getExamesFisicosDisponiveis() > 0) { - ProbabilisticNode nodoExameFisico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameFisico"); - float pcExameFisico = logExecucao.getExamesFisicosRealizados() / logExecucao.getExamesFisicosDisponiveis() * 100; -System.out.println("PERCENTUAL EXAME FISICO: " + pcExameFisico); - - if (pcExameFisico <= 20) { - diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); - exameFisicoInsuficiente = true; - } - else if (pcExameFisico > 20 && pcExameFisico <= 80) - diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); - else { - diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); - exameFisicoExcessivo = true; + + // Define a probabilidade do nodo Exame Fisico + { + if (logExecucao.getExamesFisicosDisponiveis() > 0) { + ProbabilisticNode nodoExameFisico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameFisico"); + float pcExameFisico = logExecucao.getExamesFisicosRealizados() / logExecucao.getExamesFisicosDisponiveis() * 100; + //System.out.println("PERCENTUAL EXAME FISICO: " + pcExameFisico); + + if (pcExameFisico <= 25) { + diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); + exameFisicoInsuficiente = true; + } + else if (pcExameFisico > 25 && pcExameFisico <= 75) + diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); + else { + diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); + exameFisicoExcessivo = true; + } } } - } - - // Define a probabilidade do nodo Exame Complementar - { - if (logExecucao.getExamesComplementaresProfessor() > 0) { - ProbabilisticNode nodoExameComplementar = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameComplementar"); - float pcExameComplementar = logExecucao.getExamesComplementaresRealizados() / logExecucao.getExamesComplementaresProfessor() * 100; -System.out.println("PERCENTUAL EXAME COMPLEMENTAR: " + pcExameComplementar); - - if (pcExameComplementar <= 20) { - diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); - exameComplementarInsuficiente = true; - } - else if (pcExameComplementar > 20 && pcExameComplementar <= 80) - diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); - else { - diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); - exameFisicoExcessivo = true; + + // Define a probabilidade do nodo Exame Complementar + { + if (logExecucao.getExamesComplementaresProfessor() > 0) { + ProbabilisticNode nodoExameComplementar = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameComplementar"); + float pcExameComplementar = logExecucao.getExamesComplementaresRealizados() / logExecucao.getExamesComplementaresProfessor() * 100; + // System.out.println("PERCENTUAL EXAME COMPLEMENTAR: " + pcExameComplementar); + + if (pcExameComplementar <= 25) { + diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0); + exameComplementarInsuficiente = true; + } + else if (pcExameComplementar > 25 && pcExameComplementar <= 7) + diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0); + else { + diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1); + exameFisicoExcessivo = true; + } } } - } - - // Define a probabilidade do nodo abriu ficha do paciente - { - ProbabilisticNode nodoAbriuFichaPaciente = (ProbabilisticNode) diagramaInfluencia.getNodeByName("AbriuFichaPaciente"); - if (logExecucao.isAbriuFichaPaciente()) - diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 1, "Nao", 0); - else - diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 0, "Nao", 1); - } - - // Define a probabilidade do nodo Bogus - { - if (logExecucao.getPerguntasDisponiveis() > 0) { - ProbabilisticNode nodoBogus = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Bogus"); - float pcNodoBogus = logExecucao.getPerguntasBogusRealizadas() / logExecucao.getPerguntasDisponiveis() * 100; -System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus); - - if (pcNodoBogus <= 10) - diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0, "Ausente", 1); - else if (pcNodoBogus > 10 && pcNodoBogus <= 30) { - diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0.4f, "Ausente", 0.6f); - perguntouBogus = true; - } - else { - diagramaInfluencia.setNodeState(nodoBogus, "Presente", 1, "Ausente", 0); - perguntouBogus = true; + // Define a probabilidade do nodo abriu ficha do paciente + { + ProbabilisticNode nodoAbriuFichaPaciente = (ProbabilisticNode) diagramaInfluencia.getNodeByName("AbriuFichaPaciente"); + + if (logExecucao.isAbriuFichaPaciente()) + diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 1, "Nao", 0); + else + diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 0, "Nao", 1); + } + + // Define a probabilidade do nodo Bogus + { + if (logExecucao.getPerguntasDisponiveis() > 0) { + ProbabilisticNode nodoBogus = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Bogus"); + float pcNodoBogus = logExecucao.getPerguntasBogusRealizadas() / logExecucao.getPerguntasDisponiveis() * 100; +// System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus); + + if (pcNodoBogus <= 10) + diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0, "Ausente", 1); + else if (pcNodoBogus > 10 && pcNodoBogus <= 30) { + diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0.4f, "Ausente", 0.6f); + perguntouBogus = true; + } + else { + diagramaInfluencia.setNodeState(nodoBogus, "Presente", 1, "Ausente", 0); + perguntouBogus = true; + } } } } - // Define a probabilidade de hesitação diagnostica - { - ProbabilisticNode nodoHestiacaoDiagnostico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoDiagnostico"); - - if (logExecucao.getDesmarcacoesDiagnostico() == 0) - diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0, "Ausente", 1); - else if (logExecucao.getDesmarcacoesDiagnostico() == 1) - diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0.6f, "Ausente", 0.4f); - else - diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 1, "Ausente", 0); + + if (logExecucao.isConcluiuDiagnostico()) { + // Define a probabilidade de hesitação diagnostica + { + ProbabilisticNode nodoHestiacaoDiagnostico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoDiagnostico"); + + if (logExecucao.getDesmarcacoesDiagnostico() == 0) + diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0, "Ausente", 1); + else if (logExecucao.getDesmarcacoesDiagnostico() == 1) + diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0.6f, "Ausente", 0.4f); + else + diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 1, "Ausente", 0); + } } - // Define a probabilidade de hesitação na conduta - { - ProbabilisticNode nodoHestiacaoConduta = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoConduta"); - - if (logExecucao.getDesmarcacoesConduta() == 0) - diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0, "Ausente", 1); - else if (logExecucao.getDesmarcacoesConduta() == 1) - diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0.6f, "Ausente", 0.4f); - else - diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 1, "Ausente", 0); + if (logExecucao.isConcluiuConduta()) { + // Define a probabilidade de hesitação na conduta + { + ProbabilisticNode nodoHestiacaoConduta = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoConduta"); + + if (logExecucao.getDesmarcacoesConduta() == 0) + diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0, "Ausente", 1); + else if (logExecucao.getDesmarcacoesConduta() == 1) + diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0.6f, "Ausente", 0.4f); + else + diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 1, "Ausente", 0); + } } - // Define a probabilidade de hesitação na conduta + // Define o nodo confianca { ProbabilisticNode nodoConfianca = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Confianca"); @@ -197,9 +207,117 @@ System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus); else if (logExecucao.getConfiancaAtual().equals(Log.CONFIANCA_ALTA)) diagramaInfluencia.setNodeState(nodoConfianca, "Baixa", 0, "Media", 0, "Alta", 1); } - +/* +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ExameComplementar")); + System.out.println("NODO: EXAME COMPLEMENTAR"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ExameFisico")); + System.out.println("NODO: EXAME FISICO"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Anamnese")); + System.out.println("NODO: ANAMNESE"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Investigacao")); + System.out.println("NODO: INVESTIGACAO"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("AbriuFichaPaciente")); + System.out.println("NODO: ABRIU FICHA PACIENTE"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Bogus")); + System.out.println("NODO: Bogus"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ResultadoInvestigacao")); + System.out.println("NODO: RESULTADO INVESTIGACAO"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Credibilidade")); + System.out.println("NODO: CREDIBILIDADE"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("HesitacaoDiagnostico")); + System.out.println("NODO: HESITACAO DIAGNOSTICO"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("HesitacaoConduta")); + System.out.println("NODO: HESITACAO CONDUTA"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Confianca")); + System.out.println("NODO: CONFIANCA"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} + +// Debug das probabilidades do DI: +{ + List pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Estrategia")); + System.out.println("NODO: ESTRATEGIA"); + for (ProbabilisticBean p : pd) { + System.out.println(p.getState() + ": " + p.getProbability()); + } +} +*/ // Mostra o resultado do diagrama de influencia - DecisionNode nodoTatica = (DecisionNode) diagramaInfluencia.getNodeByName("Tatica"); + DecisionNode nodoTatica = (DecisionNode) diagramaInfluencia.getNodeByName("Estrategia"); List probs = diagramaInfluencia.getProbabilidadesDescOrder(nodoTatica); for (ProbabilisticBean prob : probs) { @@ -208,58 +326,125 @@ System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus); } } - public UnBBayesUtil processaRedeAluno(Paciente paciente) throws Exception { + private String getResultadoDiagnostico() throws Exception { + // Nao selecionou o primeiro diagnostico + if (logExecucao.getPrimeiroDiagnosticoCaso() != null && !logExecucao.getDiagnostico().equals(logExecucao.getPrimeiroDiagnosticoCaso())) + if (logExecucao.getSegundoDiagnosticoCaso() != null && logExecucao.getDiagnostico().equals(logExecucao.getSegundoDiagnosticoCaso())) + return DIAGNOSTICO_INCORRETO_PLAUSIVEL; + else + return DIAGNOSTICO_INCORRETO_IMPLAUSIVEL; - UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede()); + return DIAGNOSTICO_ADEQUADO; + } - List nodosPaciente = em.createQuery("From NodoPaciente np Where np.paciente.id=:pPaciente") - .setParameter("pPaciente", paciente.getId()) - .getResultList(); - - for(NodoPaciente nodo : nodosPaciente) { - ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodo.getNodo().getNome()); - if (pn != null) - unBUtil.setNodeState(pn, "Yes", 1, "Not", 0); + private String getResultadoConduta() throws Exception { + + // Caso o diagnóstico esteja adequado verifica se a conduta foi excessiva, insuficiente ou adequada! + if (getResultadoDiagnostico().equals(DIAGNOSTICO_ADEQUADO)) { + + // Verifica se a conduta está certa ou errada! + boolean diferente=false; + for(Nodo conduta : logExecucao.getCondutas().values()) { + if (!logExecucao.getCondutasIdeaisDiagnostico().contains(conduta)) { + diferente=true; + break; + } + } + + // Esta errada + if (diferente) + return CONDUTA_INCORRETA_INCOERENTE; + + // Esta certa, agora verifica se é excessiva ou adequada! + if (logExecucao.getCondutas().size() > logExecucao.getCondutasIdeaisDiagnostico().size()) + return CONDUTA_EXCESSIVA; + else if (logExecucao.getCondutas().size() < logExecucao.getCondutasIdeaisDiagnostico().size()) + return CONDUTA_INSUFICIENTE; + else + return CONDUTA_ADEQUADA; + } + // Caso o diagnóstico esteja errado + else { + // Verifica se a conduta está certa ou errada (avalia somente a primeira) + for(Nodo conduta : logExecucao.getCondutas().values()) { + if (logExecucao.getCondutasIdeaisDiagnostico().contains(conduta)) + return CONDUTA_INCORRETA_COERENTE; + else + return CONDUTA_INCORRETA_INCOERENTE; + } } - return unBUtil; + return null; + } + + private String getResultadoCustoConduta() { + float custoRealizado=0; + float custoPrevisto=0; + + for(Nodo conduta : logExecucao.getCondutas().values()) + custoRealizado+=conduta.getCusto(); + + for(Nodo conduta : logExecucao.getCondutasIdeaisDiagnostico()) + custoPrevisto+=conduta.getCusto(); + if (custoPrevisto > 0) { + float pcCusto = custoRealizado / custoPrevisto * 100; + + if (pcCusto >= 150) + return CONDUTA_DISPENDIOSA; + } + + return null; } - private List getProbabilidades(UnBBayesUtil unBUtil, String tipoNodo) { - Iterator itNodos = em.createNamedQuery("Nodo.getByTipo") - .setParameter("pTipo", tipoNodo) - .getResultList().iterator(); + private String getResultadoTempoConduta() { + float tempoRealizado=0; + float tempoPrevisto=0; - ArrayList nodos = new ArrayList(); + for(Nodo conduta : logExecucao.getCondutas().values()) + tempoRealizado+=conduta.getTempo(); - while(itNodos.hasNext()) { - Nodo nodo = itNodos.next(); - NodoBean nodoBean = new NodoBean(nodo, (Float) unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes")); - nodos.add(nodoBean); - } + for(Nodo conduta : logExecucao.getCondutasIdeaisDiagnostico()) + tempoPrevisto+=conduta.getTempo(); - Collections.sort(nodos, new Comparator() { - @Override - public int compare(Object o1, Object o2) { - NodoBean nodo1 = (NodoBean) o1; - NodoBean nodo2 = (NodoBean) o2; - - if (nodo1.getProbabilidade() > nodo2.getProbabilidade()) - return -1; - else if (nodo1.getProbabilidade() < nodo2.getProbabilidade()) - return 1; - else - return 0; - } - }); + if (tempoPrevisto > 0) { + float pcTempo = tempoRealizado / tempoPrevisto * 100; + + if (pcTempo >= 150) + return CONDUTA_DEMORADA; + } + + return null; + } + + private String getResultadoCustoInvestigacao() { + // Verifica se a anamnese teve alto custo! + if (logExecucao.getExamesComplementaresCustoProfessor() > 0) { + float pcCusto = logExecucao.getExamesComplementaresCustoRealizado() / logExecucao.getExamesComplementaresCustoProfessor() * 100; + if (pcCusto > 150) + return INVESTIGACAO_DISPENDIOSA; + } - return nodos; + return null; } + private String getResultadoTempoInvestigacao() { + if (logExecucao.getExamesComplementaresTempoProfessor() > 0 || logExecucao.getExamesFisicosTempoProfessor() > 0) { + float pcTempo = (logExecucao.getExamesComplementaresTempoRealizado() + logExecucao.getExamesFisicosTempoRealizado()) / + (logExecucao.getExamesComplementaresTempoProfessor() + logExecucao.getExamesFisicosTempoProfessor()) * 100; + + if (pcTempo > 150) + return INVESTIGACAO_DEMORADA; + } + + return null; + } - private void populaResultadoSimulacao(Paciente paciente) throws Exception { + private void populaResultadoSimulacao() throws Exception { + + populaEstrategia(); + resultadosSimulacao = new ArrayList(); if (logExecucao.isConcluiuInvestigacao()) { @@ -296,165 +481,104 @@ System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus); resultadosSimulacao.add(INVESTIGACAO_BOGUS); // Verifica se a anamnese teve alto custo! - if (logExecucao.getExamesComplementaresCustoProfessor() > 0) { - float pcCusto = logExecucao.getExamesComplementaresCustoRealizado() / logExecucao.getExamesComplementaresCustoProfessor() * 100; - if (pcCusto > 150) - resultadosSimulacao.add(INVESTIGACAO_DISPENDIOSA); - } - - // Verifica se a anamnese foi demorada! - if (logExecucao.getExamesComplementaresTempoProfessor() > 0 || logExecucao.getExamesFisicosTempoProfessor() > 0) { - float pcTempo = (logExecucao.getExamesComplementaresTempoRealizado() + logExecucao.getExamesFisicosTempoRealizado()) / - (logExecucao.getExamesComplementaresTempoProfessor() + logExecucao.getExamesFisicosTempoProfessor()) * 100; + String resultadoCustoInvestigacao = getResultadoCustoInvestigacao(); + if (resultadoCustoInvestigacao != null) + resultadosSimulacao.add(resultadoCustoInvestigacao); - if (pcTempo > 150) - resultadosSimulacao.add(INVESTIGACAO_DEMORADA); - } + String resultadoTempoInvestigacao = getResultadoTempoInvestigacao(); + if (resultadoTempoInvestigacao != null) + resultadosSimulacao.add(resultadoTempoInvestigacao); } - boolean diagnosticoCorreto = false; - - // Verifica se o diagnóstico foi adequado if (logExecucao.isConcluiuDiagnostico()) { - UnBBayesUtil redeAluno = processaRedeAluno(paciente); - List diagnosticos = getProbabilidades(redeAluno, Nodo.DIAGNOSTICO); - Nodo primeiroDiagnostico=null; - Nodo segundoDiagnostico=null; - int i=0; - for(NodoBean nodo : diagnosticos) { - if (i == 0) - primeiroDiagnostico = nodo.getNodo(); - else if (i == 1) - segundoDiagnostico = nodo.getNodo(); - - if (++i == 2) - break; - } - -System.out.println("PRIMEIRO: " + primeiroDiagnostico); -System.out.println("LOG: " + logExecucao.getDiagnostico()); - // Nao selecionou o primeiro diagnostico - if (primeiroDiagnostico != null && !logExecucao.getDiagnostico().equals(primeiroDiagnostico)) - if (segundoDiagnostico != null && logExecucao.getDiagnostico().equals(segundoDiagnostico)) - resultadosSimulacao.add(DIAGNOSTICO_INCORRETO_PLAUSIVEL); - else - resultadosSimulacao.add(DIAGNOSTICO_INCORRETO_IMPLAUSIVEL); - - // Registra se o diagnóstico está correto - if (primeiroDiagnostico.equals(logExecucao.getDiagnostico())) - diagnosticoCorreto = true; + String resultadoDiagnostico = getResultadoDiagnostico(); + resultadosSimulacao.add(resultadoDiagnostico); } - // Ativa condutas do diagnostico proposto + // Verifica as condutas if (logExecucao.isConcluiuConduta()) { - UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede()); - unBUtil.setNodeState((ProbabilisticNode)unBUtil.getNodeByName(logExecucao.getDiagnostico().getNome()), "Yes", 1, "Not", 0); - List condutas = getProbabilidades(unBUtil, Nodo.CONDUTA); - - - // Se o diagnóstico for incorreto verifica o tipo da conduta - if (!diagnosticoCorreto) { - - // Neste caso (diagnóstico incorreto) avalia somente a primeira conduta. - for(NodoBean nodo : condutas) { - if (logExecucao.getCondutas().containsValue(nodo.getNodo())) { - resultadosSimulacao.add(CONDUTA_INCORRETA_COERENTE); - return; - } - else { - resultadosSimulacao.add(CONDUTA_INCORRETA_INCOERENTE); - return; - } - } - } else { - // Caso o diagnostico esteja incorreto verifica se a conduta foi suficiente ou insuficiente - int i=1; - int condutasAdotadas=0; - int condutasPossiveis=0; - for(NodoBean nodo : condutas) { - condutasPossiveis++; - - if (!logExecucao.getCondutas().containsValue(nodo.getNodo())) { - if (i == 1) { - resultadosSimulacao.add(CONDUTA_INCORRETA_INCOERENTE); - return; - } - } else - condutasAdotadas++; - - if (i++ == 2) - break; - } - - if (condutasAdotadas < condutasPossiveis) - resultadosSimulacao.add(CONDUTA_INSUFICIENTE); - else if (condutasAdotadas > condutasPossiveis) - resultadosSimulacao.add(CONDUTA_EXCESSIVA); - } + // Verifica a adequacao da conduta + String resultadoConduta = getResultadoConduta(); + resultadosSimulacao.add(resultadoConduta); - // AVALIAR O TEMPO E CUSTO DA CONDUTA - int c=1; - float custoTotalCondutas=0; - int tempoTotalConudtas=0; - for(NodoBean nodo : condutas) { - custoTotalCondutas+=nodo.getNodo().getCusto(); - tempoTotalConudtas+=nodo.getNodo().getTempo(); - if (c++ == 2) - break; - } - - float custoRealizadoCondutas=0; - int tempoRealizadoCondutas=0; - for(Nodo nodoConduta : logExecucao.getCondutas().values()) { - custoRealizadoCondutas+=nodoConduta.getCusto(); - tempoRealizadoCondutas+=nodoConduta.getTempo(); - } - - if (custoTotalCondutas > 0) { - float pcCustoConduta = custoRealizadoCondutas / custoTotalCondutas * 100; - if (pcCustoConduta >= 150) - resultadosSimulacao.add(CONDUTA_DISPENDIOSA); - } - + // Verifica o custo + String resultadoCondutaCusto = getResultadoCustoConduta(); + if (resultadoCondutaCusto != null) + resultadosSimulacao.add(resultadoCondutaCusto); + + // Verifica o tempo + String resultadoCondutaTempo = getResultadoTempoConduta(); + if (resultadoCondutaTempo != null) + resultadosSimulacao.add(resultadoCondutaTempo); + } - if (tempoRealizadoCondutas > 0) { - float pcTempoConduta = tempoRealizadoCondutas / tempoTotalConudtas * 100; - if (pcTempoConduta >= 150) - resultadosSimulacao.add(CONDUTA_DEMORADA); + // Após a execução da procura das falhas. Caso não haja problema da a simulação como correta + if (logExecucao.isConcluiuInvestigacao()) { + if (!resultadosSimulacao.contains(INVESTIGACAO_BOGUS) && !resultadosSimulacao.contains(INVESTIGACAO_DEMORADA) && + !resultadosSimulacao.contains(INVESTIGACAO_DISPENDIOSA) && !resultadosSimulacao.contains(INVESTIGACAO_EXCESSIVA) && + !resultadosSimulacao.contains(INVESTIGACAO_INSUFICIENTE) ) { + + resultadosSimulacao.add(INVESTIGACAO_ADEQUADA); } - } } + + public NegociacaoPedagogica(long idSessao, Paciente paciente) throws Exception { + em = DbUtil.getInstance().getEntityManager(); + SessaoUsuario sessaoUsuario = em.find(SessaoUsuario.class, idSessao); + this.sessaoUsuario = sessaoUsuario; + this.paciente = paciente; - public NegociacaoPedagogica(long idSessao, Paciente paciente) throws Exception { - em = DbUtil.getInstance().getEntityManager(); - // Busca o log de execução - logExecucao = new LogExecucao(idSessao, paciente.getCaso().getId(), paciente.getRede().getId()); + logExecucao = new LogExecucao(sessaoUsuario, paciente); + } + + public String getIntervencao(String etapa) throws Exception { System.out.println(logExecucao); - populaEstrategia(); - populaResultadoSimulacao(paciente); - + populaResultadoSimulacao(); + System.out.println("ESTRATÉGIA: " + estrategia); System.out.println("RESULTADOS:"); for(String resultado : resultadosSimulacao) { - System.out.println(resultado); -/* - IntervencaoPedagogica intervencao = new IntervencaoPedagogica(); + System.out.println(resultado + " - " + etapa); + + // Registra somente resultados referentes a posicao atual do simulador + if (etapa.equals(Log.ETAPA_INVESTIGACAO) && !resultado.startsWith("INVESTIGACAO") && !resultado.equals(NAO_ABRIU_FICHA_PACIENTE)) + continue; + // Registra somente resultados referentes a posicao atual do simulador + if (etapa.equals(Log.ETAPA_DIAGNOSTICO) && !resultado.startsWith("DIAGNOSTICO")) + continue; + + // Registra somente resultados referentes a posicao atual do simulador + if (etapa.equals(Log.ETAPA_CONDUTA) && !resultado.startsWith("CONDUTA")) + continue; + + + + try { + IntervencaoPedagogica testarExistencia = (IntervencaoPedagogica) em.createQuery("From IntervencaoPedagogica where sessaoUsuario.id=:pSessao and estrategia=:pEstrategia and resultado=:pResultado") + .setParameter("pSessao", sessaoUsuario.getId()) + .setParameter("pEstrategia", estrategia) + .setParameter("pResultado", resultado) + .getSingleResult(); + continue; + } catch(NoResultException e) { } + if (!em.getTransaction().isActive()) em.getTransaction().begin(); + IntervencaoPedagogica intervencao = new IntervencaoPedagogica(); intervencao.setAplicada(false); intervencao.setDataGeracao(new Date()); intervencao.setEstrategia(estrategia); intervencao.setResultado(resultado); - intervencao.setSessaoUsuario(em.find(SessaoUsuario.class, idSessao)); + intervencao.setSessaoUsuario(sessaoUsuario); TaticaPedagogica tatica = (TaticaPedagogica) em.createQuery("From TaticaPedagogica where resultado=:pResultado and estrategia=:pEstrategia") .setParameter("pResultado", resultado) @@ -463,12 +587,131 @@ System.out.println("LOG: " + logExecucao.getDiagnostico()); intervencao.setTatica(tatica); em.persist(intervencao); + em.getTransaction().commit(); + } + + // Busca as intervencoes a serem mostradas agora! + { + StringBuilder retorno = new StringBuilder(); + + Iterator itIntervencoes = em.createQuery("From IntervencaoPedagogica where sessaoUsuario.id=:pSessao and aplicada=false order by dataGeracao desc") + .setParameter("pSessao", sessaoUsuario.getId()) + .getResultList() + .iterator(); + + if (!itIntervencoes.hasNext()) + return " "; + + retorno.append(" "); + return retorno.toString(); } + } + + public String getMensagemFinal() throws Exception { + StringBuilder retorno = new StringBuilder(); + + retorno.append("PACIENTE: " + paciente.getNome() + "\n\n"); + + retorno.append("RESUMO:\n"); + + + // Diagnostico + String resultadoDiagnostico = getResultadoDiagnostico(); + if (resultadoDiagnostico.equals(DIAGNOSTICO_ADEQUADO)) + retorno.append("-Você chegou ao diagnóstico previsto para esta simulação!\n"); + else if (resultadoDiagnostico.equals(DIAGNOSTICO_INCORRETO_PLAUSIVEL)) + retorno.append("-Você não chegou ao diagnóstico previsto para esta simulação! Porém, seu diagnóstico é plausível!\n"); + else + retorno.append("-Você não chegou ao diagnóstico previsto para esta simulação! Seu diagnóstico não é plausível!\n"); + + // Conduta + String resultadoConduta = getResultadoConduta(); + if (resultadoConduta.equals(CONDUTA_ADEQUADA)) + retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação!\n"); + else if (resultadoConduta.equals(CONDUTA_EXCESSIVA)) + retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação, porém existem procedimentos em excesso!\n"); + else if (resultadoConduta.equals(CONDUTA_INSUFICIENTE)) + retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação, porém a quantidade de procedimentos é insuficiente em relação ao previsto!\n"); + else if (resultadoConduta.equals(CONDUTA_INCORRETA_COERENTE)) + retorno.append("-A conduta selecionada esta inadequada ao previsto pela simulação, porém é coerente com o diagnóstico selecionado!\n"); + else if (resultadoConduta.equals(CONDUTA_INCORRETA_INCOERENTE)) + retorno.append("-A conduta selecionada esta inadequada e incoerente com o diagnóstico selecionado!\n"); + + String resultadoTempoConduta = getResultadoTempoConduta(); + String resultadoTempoInvestigacao = getResultadoTempoInvestigacao(); + if (resultadoTempoConduta != null || resultadoTempoInvestigacao != null) { + retorno.append("-Quanto a utilização do tempo "); + if (resultadoTempoInvestigacao != null && resultadoTempoConduta != null) + retorno.append("sua investigação e conduta foram demoradas"); + else if (resultadoTempoInvestigacao != null) + retorno.append("sua investigação foi demorada"); + else if (resultadoTempoConduta != null) + retorno.append("sua conduta foi demorada"); + retorno.append("!\n"); + } + + String resultadoCustoConduta = getResultadoCustoConduta(); + String resultadoCustoInvestigacao = getResultadoCustoInvestigacao(); + if (resultadoCustoConduta != null || resultadoCustoInvestigacao != null) { + retorno.append("-Quanto a utilização de recursos "); + if (resultadoCustoInvestigacao != null && resultadoCustoConduta != null) + retorno.append("sua investigação e conduta foram dispendiosas"); + else if (resultadoCustoInvestigacao != null) + retorno.append("sua investigação foi dispendiosa"); + else if (resultadoCustoConduta != null) + retorno.append("sua conduta foi dispendiosa"); + retorno.append("!\n"); + } + + // Log de execução + List logPerguntas = em.createQuery("From LogPerguntas where sessaoUsuario.id=:pIdSessao and paciente.id=:pIdPaciente") + .setParameter("pIdSessao", sessaoUsuario.getId()) + .setParameter("pIdPaciente", paciente.getId()) + .getResultList(); + + // Mostra os sintomas esperados: + retorno.append("\n\nSINAIS / SINTOMAS:\nAS PERGUNTAS QUE PODERIAM FORTALECER O DIAGNÓSTICO SÃO:\n"); + for(LogPerguntas logPergunta : logPerguntas) { + if (logPergunta.getTipoNodo().equals(Nodo.SINAL_SINTOMA) && logPergunta.isAtivo()) + retorno.append(logPergunta.getPergunta() + "\n"); + } + + // Mostra os sintomas selecionados: + retorno.append("\n\nAS PERGUNTAS SELECIONADAS NO DECORRER DA SUA SIMULAÇÃO FORAM:\n"); + List nodosInvestigacao = logExecucao.getNodosInvestigacao(); + for(Nodo nodoInvestigacao : nodosInvestigacao) { + if (nodoInvestigacao.getTipo().equals(Nodo.SINAL_SINTOMA)) { + for(LogPerguntas logPergunta : logPerguntas) { + if (logPergunta.getNodo().getId() == nodoInvestigacao.getId()) { + retorno.append(logPergunta.getPergunta() + "\n"); + break; + } + } + } + } + + return retorno.toString(); } } diff --git a/src/java/org/ufcspa/simdecs/util/UnBBayesUtil.java b/src/java/org/ufcspa/simdecs/util/UnBBayesUtil.java index 5a826f7..33525ac 100644 --- a/src/java/org/ufcspa/simdecs/util/UnBBayesUtil.java +++ b/src/java/org/ufcspa/simdecs/util/UnBBayesUtil.java @@ -7,6 +7,10 @@ package org.ufcspa.simdecs.util; import java.io.File; import java.security.InvalidParameterException; import java.util.*; +import javax.persistence.EntityManager; +import org.ufcspa.simdecs.entities.Nodo; +import org.ufcspa.simdecs.entities.NodoPaciente; +import org.ufcspa.simdecs.entities.Paciente; import org.ufcspa.simdecs.entities.Rede; import org.ufcspa.simdecs.exceptions.InvalidNodeState; import unbbayes.io.xmlbif.version6.XMLBIFIO; @@ -166,5 +170,101 @@ public class UnBBayesUtil { return listProbs; } + public static UnBBayesUtil getRedePaciente(EntityManager em, Paciente paciente) throws Exception { + + UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede()); + + List nodosPaciente = em.createQuery("From NodoPaciente np Where np.paciente.id=:pPaciente") + .setParameter("pPaciente", paciente.getId()) + .getResultList(); + + for(NodoPaciente nodo : nodosPaciente) { + ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodo.getNodo().getNome()); + if (pn != null) + unBUtil.setNodeState(pn, "Yes", 1, "Not", 0); + } + + return unBUtil; + } + public List getProbabilidades(EntityManager em, String tipoNodo) { + Iterator itNodos = em.createNamedQuery("Nodo.getByTipo") + .setParameter("pTipo", tipoNodo) + .getResultList().iterator(); + + ArrayList nodos = new ArrayList(); + + while(itNodos.hasNext()) { + Nodo nodo = itNodos.next(); + NodoBean nodoBean = new NodoBean(nodo, (Float) getProbabilidadeByState((TreeVariable) getNodeByName(nodo.getNome()), "Yes")); + nodos.add(nodoBean); + } + + Collections.sort(nodos, new Comparator() { + @Override + public int compare(Object o1, Object o2) { + NodoBean nodo1 = (NodoBean) o1; + NodoBean nodo2 = (NodoBean) o2; + + if (nodo1.getProbabilidade() > nodo2.getProbabilidade()) + return -1; + else if (nodo1.getProbabilidade() < nodo2.getProbabilidade()) + return 1; + else + return 0; + } + }); + + return nodos; + } + + public Nodo getPrimeiroDiagnostico(EntityManager em) { + List diagnosticos = getProbabilidades(em, Nodo.DIAGNOSTICO); + for(NodoBean nodoBean : diagnosticos) { + return nodoBean.getNodo(); + } + + return null; + } + + public Nodo getSegundoDiagnostico(EntityManager em) { + List diagnosticos = getProbabilidades(em, Nodo.DIAGNOSTICO); + + int d=1; + float probabilidadeDiag1=0; + float probabilidadeDiag2=0; + Nodo segundoDiagnostico=null; + for(NodoBean nodoBean : diagnosticos) { + if (d == 1) + probabilidadeDiag1 = nodoBean.getPercentualProbabilidade(); + if (d == 2) { + probabilidadeDiag2 = nodoBean.getPercentualProbabilidade(); + segundoDiagnostico = nodoBean.getNodo(); + } + + if (d++ == 2) + break; + } + + float diferenca = probabilidadeDiag1 - probabilidadeDiag2; + if (diferenca <= 25) + return segundoDiagnostico; + else + return null; + } + + public List getCondutas(EntityManager em) { + List condutas = getProbabilidades(em, Nodo.CONDUTA); + List condutasRetornar = new ArrayList(); + for(NodoBean conduta : condutas) { + if (conduta.getPercentualProbabilidade() < 50) + continue; + + condutasRetornar.add(conduta.getNodo()); +//System.out.println("CONDUTA*: " + conduta.getNodo().getNomeAmigavel()); + } + + return condutasRetornar; + + } } diff --git a/web/redes/dinovo.xml b/web/redes/dinovo.xml new file mode 100644 index 0000000..fd924a7 --- /dev/null +++ b/web/redes/dinovo.xml @@ -0,0 +1,390 @@ + + + + 1.0 + direvisado + UnBBayes + + + 40 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Investigacao + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.33333298563957214 + 0.33333298563957214 + 0.33333298563957214 + + + + + + 0.33333298563957214 + 0.33333298563957214 + 0.33333298563957214 + + + + + + 0.33333298563957214 + 0.33333298563957214 + 0.33333298563957214 + + + + + + 0.33333298563957214 + 0.33333298563957214 + 0.33333298563957214 + + + + + + + + + + + 0.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + + + + + + + + + + + 0.05000000074505806 + 0.949999988079071 + 0.699999988079071 + 0.30000001192092896 + 0.30000001192092896 + 0.699999988079071 + 0.10000000149011612 + 0.8999999761581421 + 0.75 + 0.25 + 0.3499999940395355 + 0.6499999761581421 + 0.6000000238418579 + 0.4000000059604645 + 0.8500000238418579 + 0.15000000596046448 + 0.699999988079071 + 0.30000001192092896 + 0.699999988079071 + 0.30000001192092896 + 0.949999988079071 + 0.05000000074505806 + 0.800000011920929 + 0.20000000298023224 + + + + + + 0.5 + 0.5 + + + + + + 0.5 + 0.5 + + + + + + 0.5 + 0.5 + + + + + + + + + + + 0.949999988079071 + 0.02500000037252903 + 0.02500000037252903 + 0.800000011920929 + 0.15000000596046448 + 0.05000000074505806 + 0.3499999940395355 + 0.05000000074505806 + 0.6000000238418579 + 0.25 + 0.25 + 0.5 + 0.4000000059604645 + 0.550000011920929 + 0.05000000074505806 + 0.3499999940395355 + 0.15000000596046448 + 0.5 + 0.800000011920929 + 0.05000000074505806 + 0.15000000596046448 + 0.6000000238418579 + 0.05000000074505806 + 0.3499999940395355 + 0.15000000596046448 + 0.05000000074505806 + 0.800000011920929 + 0.800000011920929 + 0.10000000149011612 + 0.10000000149011612 + 0.6000000238418579 + 0.3499999940395355 + 0.05000000074505806 + 0.3499999940395355 + 0.05000000074505806 + 0.6000000238418579 + 0.5 + 0.44999998807907104 + 0.05000000074505806 + 0.33333298563957214 + 0.33333298563957214 + 0.33333298563957214 + 0.20000000298023224 + 0.20000000298023224 + 0.6000000238418579 + 0.5 + 0.10000000149011612 + 0.4000000059604645 + 0.30000001192092896 + 0.30000001192092896 + 0.4000000059604645 + 0.10000000149011612 + 0.10000000149011612 + 0.800000011920929 + 0.699999988079071 + 0.15000000596046448 + 0.15000000596046448 + 0.4000000059604645 + 0.20000000298023224 + 0.4000000059604645 + 0.15000000596046448 + 0.15000000596046448 + 0.699999988079071 + 0.4000000059604645 + 0.20000000298023224 + 0.4000000059604645 + 0.30000001192092896 + 0.30000001192092896 + 0.4000000059604645 + 0.05000000074505806 + 0.20000000298023224 + 0.75 + 0.3499999940395355 + 0.05000000074505806 + 0.6000000238418579 + 0.10000000149011612 + 0.4000000059604645 + 0.5 + 0.2547770142555237 + 0.019108299165964127 + 0.7261149883270264 + + + + + + 0.5 + 0.5 + + + + + + + + + + + 0.15000000596046448 + 0.15000000596046448 + 0.699999988079071 + 0.20000000298023224 + 0.20000000298023224 + 0.6000000238418579 + 0.20000000298023224 + 0.6000000238418579 + 0.20000000298023224 + 0.8999999761581421 + 0.05000000074505806 + 0.05000000074505806 + 0.05000000074505806 + 0.05000000074505806 + 0.8999999761581421 + 0.05000000074505806 + 0.05000000074505806 + 0.8999999761581421 + 0.10000000149011612 + 0.10000000149011612 + 0.800000011920929 + 0.02500000037252903 + 0.02500000037252903 + 0.949999988079071 + + + + + \ No newline at end of file -- 1.7.6.4