package beans; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.TreeMap; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagementType; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import smile.Network; import model.Alumno; import model.Asignatura; import model.Concepto; import model.Curso; import model.Ejercicio; import model.Respuesta; import model.Sesion; import model.Tarea; import model.Tema; /** * Session Bean implementation class EjercitarWS */ @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) @Remote(EjercitarWSRemote.class) @Stateless public class EjercitarWSBean implements EjercitarWSRemote { @PersistenceContext EntityManager em; @EJB AdministracionBean admin; /** * Default constructor. */ public EjercitarWSBean() { } @WebMethod public String getDatosAlumno(int idAlumno) { // TODO Auto-generated method stub System.out.println("getdatosalumno"); Alumno alumno = em.find(Alumno.class, idAlumno); String curso = alumno.getCurso().getSeccion() + ""+ alumno.getCurso().getTurno(); String escuela = alumno.getCurso().getEscuela().getNombre(); String nombreApellidoCursoEscuela = alumno.getNombre() + "#" + alumno.getApellido() + "#" + curso + "#" + escuela ; return nombreApellidoCursoEscuela; } @WebMethod public String [] getTareas(int idAlumno) { // TODO Auto-generated method stub System.out.println(idAlumno); Alumno alumno = em.find(Alumno.class, idAlumno); System.out.println(alumno.getApellido()); Curso curso = getCurso(alumno); List listaTareas = curso.getTareaList(); System.out.println("cant tareas:" + listaTareas.size()); /*Query query = em.createQuery("SELECT DISTINCT t from Tarea t left outer join t.sesionList s where s.alumno = :alumno and s.estadoTerminado = false and s.tarea in (:tareas)"); query.setParameter("alumno", alumno); query.setParameter("tareas", listaTareas); List listaTareasDisponibles = query.getResultList(); //return (List) listaTareas; System.out.println(listaTareasDisponibles.size());*/ List listaTareasDisponibles = new ArrayList(); if(listaTareasDisponibles.size() == 0){ listaTareasDisponibles = listaTareas; } String [] arrayTareas = new String [listaTareasDisponibles.size()]; int c = 0; for (Tarea tarea : listaTareasDisponibles) { String tareaElement = tarea.getIdTarea().toString() + "#" + tarea.getDescripcion(); arrayTareas[c] = tareaElement; c++; } return arrayTareas; } private Curso getCurso(Alumno alumno) { Curso curso = alumno.getCurso(); System.out.println(curso.getTareaList().toString()); return curso; } @WebMethod public String getSiguienteEjercicio(int idTarea, int idAlumno, int idEjercicio, String respuesta) { // TODO Auto-generated method stub Tarea tarea = em.find(Tarea.class, idTarea); Alumno alumno = em.find(Alumno.class, idAlumno); // if(idEjercicio != 0) responderEjercicio(idEjercicio, respuesta, alumno, tarea.getAsignatura().getIdAsignatura(), tarea); // //Ejercicio ejercicio = seleccionAleatoria(tarea); Ejercicio ejercicio = seleccionUtilidadMax(tarea, alumno, idEjercicio); String enunciado = toASCII(ejercicio.getEnunciado()); String ejercicioElement = ejercicio.getIdEjercicio().toString() + "#" + enunciado; return ejercicioElement; } private void responderEjercicio(int idEjercicio, String respuesta, Alumno alumno, int idAsignatura, Tarea tarea) { Ejercicio ejercicio = em.find(Ejercicio.class, idEjercicio); Network net1 = new Network(); String nombreRed = "red_alumno_" + alumno.getIdAlumno() + "_asignatura_" + idAsignatura + ".xdsl"; net1.readFile("/home/redes/" + nombreRed); net1.updateBeliefs(); String nombreEjercicio = "E" + idEjercicio; if(respuesta.equals(ejercicio.getRespuesta().getDescripcion())) { net1.setEvidence(nombreEjercicio, "Correcto"); } else { net1.setEvidence(nombreEjercicio, "Incorrecto"); } net1.updateBeliefs(); List conceptoList = ejercicio.getConceptoList(); for (Concepto concepto : conceptoList) { String nombreConcepto = concepto.getNombre(); double [] probCalc = net1.getNodeValue(nombreConcepto); //System.out.println("proba " + probCalc.toString()); net1.setNodeDefinition(nombreConcepto, probCalc); } net1.clearEvidence(nombreEjercicio); net1.updateBeliefs(); net1.writeFile("/home/redes/" + nombreRed); //asociar ejercicio con sesion //para obtener la sesion anterior. Query query = em.createQuery("Select s from Sesion s where s.alumno.idAlumno = :alumno and s.tarea.idTarea = :tarea order by s.idSesion desc"); query.setParameter("alumno", alumno.getIdAlumno()); query.setParameter("tarea", tarea.getIdTarea()); query.setMaxResults(1); Sesion sesionAnterior = (Sesion) query.getSingleResult(); List respondidos = sesionAnterior.getEjercicioList(); if(respondidos==null){ respondidos = new ArrayList(); } respondidos.add(ejercicio); sesionAnterior.setEjercicioList(respondidos); em.persist(sesionAnterior); } @WebMethod public String getText() { return "hola mundo"; } private Ejercicio seleccionAleatoria(Tarea tarea) { // Tema tema = tarea.getTema(); // List = tema.getIdConcepto() List ejercicios = em.createQuery("SELECT e FROM Ejercicio e").getResultList(); System.out.println(ejercicios.size()); Random rnd = new Random(); int siguienteID = rnd.nextInt(ejercicios.size()); System.out.println(siguienteID); Ejercicio ejercicio = ejercicios.get(siguienteID); System.out.println(ejercicio.getEnunciado().getBytes()); return ejercicio; } private Ejercicio seleccionUtilidadMax(Tarea tarea, Alumno alumno, int idEjercicioAnterior) { try{ //para obtener la sesion anterior. Query query = em.createQuery("Select s from Sesion s where s.alumno.idAlumno = :alumno and s.tarea.idTarea = :tarea order by s.idSesion desc"); query.setParameter("alumno", alumno.getIdAlumno()); query.setParameter("tarea", tarea.getIdTarea()); query.setMaxResults(1); Sesion sesionAnterior = (Sesion) query.getSingleResult(); List conceptoList = em.createQuery("Select c from Concepto c inner join c.tareaList t where t = :tarea").setParameter("tarea", tarea).getResultList(); // inicializacion double utilidadMax = 0; Map hUtilidades= new HashMap(); Ejercicio ejercicio = null; // System.out.println("cantidad concepto: " + conceptoList.size() + " de la tarea: " + tarea.getDescripcion()); for (Concepto concepto : conceptoList) { //System.out.println("concepto " + concepto.getNombre()); Network net1 = new Network(); String nombreRed = "red_alumno_" + alumno.getIdAlumno() + "_asignatura_" + tarea.getAsignatura().getIdAsignatura() +".xdsl"; //System.out.println("seleccionUtilidadMax - /home/redes/" + nombreRed); net1.readFile("/home/redes/" + nombreRed); net1.updateBeliefs(); String nombreConcepto = concepto.getNombre(); double [] values = net1.getNodeValue(nombreConcepto); //System.out.println("values"); //System.out.println(" pC0: " + values[0]); //System.out.println(" pC1: " + values[1]); double pC1 = values[1]; // P(C=1) double pC0 = values[0]; // P(C=0) int cont = 0; List ejercicios = concepto.getEjercicioList(); //System.out.println("cantidad ejercicio: " + ejercicios.size()); for(Ejercicio ejercicioConcepto : ejercicios){ String nombreEjercicio = "E" + ejercicioConcepto.getIdEjercicio(); values = net1.getNodeValue(nombreEjercicio); double pE1 = values[1]; // P(E=1) double pE0 = values[0]; // P(E=0) //System.out.println("nombreEjercicio: " + nombreEjercicio); net1.setEvidence(nombreConcepto, "Conoce"); net1.updateBeliefs(); values = net1.getNodeValue(nombreEjercicio); //System.out.println("values " + values); double pE1C1 = values[1]; // P(E=1/C=1) //System.out.println("pE1C1: " + pE1C1); double pAuxi1 = pE1C1-pE1; //P(E=1/C=1) - P(E=1) double utilidadParcial1 = pAuxi1 * pC1; //System.out.println("utilidadParcial1: " + utilidadParcial1); net1.clearEvidence(nombreConcepto); net1.updateBeliefs(); net1.setEvidence(nombreConcepto, "No_conoce"); net1.updateBeliefs(); values = net1.getNodeValue(nombreEjercicio); //System.out.println("values_ " + values); double pE0C0 = values[0]; // P(E=0/C=0) //System.out.println("pE0C0: " + pE0C0); double pAuxi0 = pE0C0-pE0; //P(E=0/C=0) - P(E=0) double utilidadParcial2 = pAuxi0 * pC0; //System.out.println("utilidadParcial2: " + utilidadParcial2); double utilidadMaxParcial = utilidadParcial1 + utilidadParcial2; /* if(utilidadMaxParcial > utilidadMax) { utilidadMax = utilidadMaxParcial; ejercicio = ejercicioConcepto; } else if (utilidadMaxParcial == utilidadMax) { Random rnd = new Random(); int eleccion = rnd.nextInt(2); if (eleccion == 1) { ejercicio = ejercicioConcepto; } } */ List utilidades = hUtilidades.get(utilidadMaxParcial); if (utilidades == null ) utilidades = new ArrayList(); if (!sesionAnterior.getEjercicioList().contains(ejercicioConcepto)) utilidades.add(ejercicioConcepto); if (utilidades.size() > 0) hUtilidades.put(utilidadMaxParcial, utilidades); //System.out.println("utilidadMax: " + utilidadMax); //System.out.println("cont" + cont++); } } //System.out.println("obtener la sesion anterior "); TreeMap tUtilidades = new TreeMap(hUtilidades); ///System.out.println(tUtilidades); //int i = tUtilidades.size(); Map.Entry valor; Map.Entry primerValor; valor = tUtilidades.pollLastEntry(); //primerValor = valor; //System.out.println("primerValor: " + primerValor); List lista = valor.getValue(); Random rnd = new Random(); int eleccion = rnd.nextInt(lista.size()); return (Ejercicio) lista.get(eleccion); /* while(true) { if (valor == null) { List lista = primerValor.getValue(); Random rnd = new Random(); int eleccion = rnd.nextInt(lista.size()); return (Ejercicio) lista.get(eleccion); } List lista = valor.getValue(); if(sesionAnterior.getEjercicioList()== null || !sesionAnterior.getEjercicioList().contains(e)) { return e; } valor = tUtilidades.pollLastEntry(); }*/ //return ejercicio; }catch(Exception e){ e.printStackTrace(); } return null; } @WebMethod public Integer registrarSesion(int idAlumno, int idTarea, Boolean ayudaPadres, Boolean desdeHogar, String estadoAnimo) { Sesion sesion = new Sesion(); sesion.setEntrada(new Date(System.currentTimeMillis())); sesion.setAyudaPadres(ayudaPadres); sesion.setDesdeHogar(desdeHogar); sesion.setEstadoAnimo(estadoAnimo); sesion.setEstadoTerminado(false); sesion.setCantidadEjerciciosResueltos(0); Alumno alumno = em.find(Alumno.class, idAlumno); Tarea tarea = em.find(Tarea.class, idTarea); sesion.setAlumno(alumno); sesion.setTarea(tarea); em.persist(sesion); return sesion.getIdSesion(); } @WebMethod public Alumno obtenerIdAlumno(String serial) { // TODO Auto-generated method stub // Alumno alumno = (Alumno) // em.createQuery("Select a from Alumno a where a.serial = :serial").getParameter(serial, // serial).; Alumno alumno = (Alumno) em .createQuery("Select a from Alumno a where a.serial = :serial") .setParameter("serial", serial).getSingleResult(); return alumno; } /** * Función que elimina acentos y caracteres especiales de * una cadena de texto. * @param input * @return cadena de texto limpia de acentos y caracteres especiales. */ public String toASCII(String input) { // Cadena de caracteres original a sustituir. String original = "áàäéèëíìïóòöúùuñÁÀÄÉÈËÍÌÏÓÒÖÚÙÜÑçÇ"; // Cadena de caracteres ASCII que reemplazarán los originales. String ascii = "aaaeeeiiiooouuunAAAEEEIIIOOOUUUNcC"; String output = input; for (int i=0; i temas = (List) em.createQuery("select t from Tema t where t.asignatura = :asignatura").setParameter("asignatura", asignatura).getResultList(); System.out.println("tema " + temas.size()); List conceptos = (List) em.createQuery("select c from Concepto c where c.tema in :temas").setParameter("temas", temas).getResultList(); System.out.println("conceptos " + conceptos.size() ); Network net = new Network(); net.readFile("/home/redes/red_asignatura_3.xdsl"); System.out.println("########## leido #############"); for(Concepto concepto : conceptos){ for(Ejercicio ejercicio : concepto.getEjercicioList()){ String titulo = "E" + Integer.toString(ejercicio.getIdEjercicio()); System.out.println(titulo); double[] ejercicioDef = admin.calcularProbabilidadesCCI(ejercicio); net.setNodeDefinition(titulo, ejercicioDef); } } net.writeFile("/home/redes/red_asignatura_3.xdsl"); } }