public Dependencia(IEnumerable <string> i, IEnumerable <string> j)
 {
     implicante = new ItemsSet <string>();
     implicados = new ItemsSet <string>();
     implicante.UnionWith(i);
     implicados.UnionWith(j);
 }
        public HashSet <Dependencia> TestDependencias(HashSet <Dependencia> posiblesDependencias, double confianza = 0.2)
        {
            HashSet <Dependencia>      respuesta = new HashSet <Dependencia>();
            Dictionary <String, Int32> conteo    = new Dictionary <string, int>();

            foreach (FPNode node in headersTable.Values)
            {
                FPNode n = node;
                int    i = 0;
                while (n != null)
                {
                    i += node.Conteo;
                    n  = n.Siguiente;
                }
                conteo.Add(node.Contenido, i);
            }

            List <String> lista = conteo.ToList().OrderBy(c => c.Value).Select(c => c.Key).ToList();
            int           total = conteo.Sum(c => c.Value);

            conteo = null;
            Dictionary <ItemsSet <String>, int> soportes = new Dictionary <ItemsSet <string>, int>();

            foreach (Dependencia dependencia in posiblesDependencias)
            {
                ItemsSet <String> dividendo = new ItemsSet <string>();
                dividendo.UnionWith(dependencia.Implicante.Union(dependencia.Implicados));
                if (!soportes.ContainsKey(dividendo))
                {
                    AgregarSoporte(lista, dividendo, soportes);
                }

                ItemsSet <String> divisor = new ItemsSet <string>();
                divisor.UnionWith(dependencia.Implicante);
                if (!soportes.ContainsKey(divisor))
                {
                    AgregarSoporte(lista, divisor, soportes);
                }
                if ((soportes[dividendo] + 0.0) / (soportes[divisor] + 0.0) >= confianza)
                {
                    respuesta.Add(dependencia);
                }
            }
            return(respuesta);
        }
        public HashSet <ItemsSet <String> > FPGrow(int epsilon, List <String> previos = null)
        {
            //si previos es default
            if (previos == null)
            {
                //instancia a previos
                previos = new List <string>();
            }

            //crea el conjuto de respuesta
            HashSet <ItemsSet <String> > respuesta = new HashSet <ItemsSet <string> >();

            //para cada item en el arbol
            foreach (KeyValuePair <string, FPNode> entry in headersTable)
            {
                //obtiene su nodo inicial
                FPNode node = entry.Value;
                //crea un nuevo set de items
                ItemsSet <String> items = new ItemsSet <string>();
                //agrega los los items previos que se han hecho y an llevado a esta instancia de arbol
                items.UnionWith(previos);
                //agrega el nodo que se esta evaluando
                items.Add(node.Contenido);
                //agrega a la respueta el set de items
                respuesta.Add(items);
                //crea una copia de los previos
                List <String> nueva = Extenciones.Clone <String>(previos);
                //agrega el actual
                nueva.Add(node.Contenido);
                //genera el arbol condicional para el item actual
                FPTree conditional = GetConditional(node, epsilon);
                //llama recursivamente sobre el arbol condicional y une las respuestas
                respuesta.UnionWith(conditional.FPGrow(epsilon, nueva));
            }
            return(respuesta);
        }