private void Aplicar(Regra Regra, double confianca) { lock (this) { Aplicadas.Add(Regra); flag = true; } Parallel.ForEach(Regra.Entao, a => AplicaAção(a, confianca)); }
private void Montar(Regra Regra) { bool Cond = false; if (Regra.Se.Operador == "=") { Cond = Regra.Se.Variavel.Valores.Select(o => o.Valor).Contains(Regra.Se.Valor); } else if (Regra.Se.Operador == "!=") { Cond = !Regra.Se.Variavel.Valores.Select(o => o.Valor).Contains(Regra.Se.Valor); } else if (Regra.Se.Operador == ">") { Cond = Convert.ToDecimal(Regra.Se.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) > Convert.ToDecimal(Regra.Se.Valor); } else if (Regra.Se.Operador == "<") { Cond = Convert.ToDecimal(Regra.Se.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) < Convert.ToDecimal(Regra.Se.Valor); } else if (Regra.Se.Operador == ">=") { Cond = Convert.ToDecimal(Regra.Se.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) >= Convert.ToDecimal(Regra.Se.Valor); } else if (Regra.Se.Operador == "<=") { Cond = Convert.ToDecimal(Regra.Se.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) <= Convert.ToDecimal(Regra.Se.Valor); } if (Regra.Se.NOT) { Cond = !Cond; } int max = 0; int Pos = 0; try { Pos = Regra.Ou.OrderByDescending(o => o.Pos).FirstOrDefault().Pos; if (Pos > max) { max = Pos; } } catch (ArgumentNullException e) { Console.WriteLine(e); } try { Pos = Regra.E.OrderByDescending(o => o.Pos).FirstOrDefault().Pos; if (Pos > max) { max = Pos; } } catch (Exception) { } for (int i = 1; i <= max; i++) { Cabecario temp = new Cabecario(); try { temp = Regra.E.Where(o => o.Pos == i).Select(o => o.Cabeca).SingleOrDefault(); } catch (Exception) { temp = null; } if (temp != null) { if (temp.Operador == "=") { Cond = Cond & temp.Variavel.Valores.Select(o => o.Valor).Contains(temp.Valor); } else if (temp.Operador == "!=") { Cond = Cond & !temp.Variavel.Valores.Select(o => o.Valor).Contains(temp.Valor); } else if (temp.Operador == ">") { Cond = Cond & Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) > Convert.ToDecimal(temp.Valor); } else if (temp.Operador == "<") { Cond = Cond & Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) < Convert.ToDecimal(temp.Valor); } else if (temp.Operador == ">=") { Cond = Cond & Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) >= Convert.ToDecimal(temp.Valor); } else if (temp.Operador == "<=") { Cond = Cond & Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) <= Convert.ToDecimal(temp.Valor); } if (temp.NOT) { Cond = !Cond; } } try { temp = Regra.Ou.Where(o => o.Pos == i).Select(o => o.Cabeca).SingleOrDefault(); } catch (Exception) { temp = null; } if (temp != null) { if (temp.Operador == "=") { Cond = Cond | temp.Variavel.Valores.Select(o => o.Valor).Contains(temp.Valor); } else if (temp.Operador == "!=") { Cond = Cond | !temp.Variavel.Valores.Select(o => o.Valor).Contains(temp.Valor); } else if (temp.Operador == ">") { Cond = Cond | Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) > Convert.ToDecimal(temp.Valor); } else if (temp.Operador == "<") { Cond = Cond | Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) < Convert.ToDecimal(temp.Valor); } else if (temp.Operador == ">=") { Cond = Cond | Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) >= Convert.ToDecimal(temp.Valor); } else if (temp.Operador == "<=") { Cond = Cond | Convert.ToDecimal(temp.Variavel.Valores.OrderByDescending(o => o.Confianca).Select(o => o.Valor).FirstOrDefault()) <= Convert.ToDecimal(temp.Valor); } if (temp.NOT) { Cond = !Cond; } } } if (Cond) { Aplicadas.Add(Regra); foreach (var item in Regra.Entao) { Entao(item); } } }
private void Montar(Regra Regra) { BancoDeDados db = new BancoDeDados(); Regra = db.Regras.Where(a => a.ID == Regra.ID).SingleOrDefault(); double confianca = 1; bool resultado = Cabecas.Select(a => a.Item1.ID).Contains(Regra.Se.ID); if (resultado) { confianca = Cabecas.Where(a => a.Item1.ID == Regra.Se.ID).SingleOrDefault().Item2; } int cont = Regra.E.Count + Regra.Ou.Count; if (cont == 0) { if (resultado) { Aplicar(Regra, confianca); return; } else { return; } } ; for (int i = 1; i <= cont; i++) { try { ListaE temp = Regra.E.Where(a => a.Pos == i).SingleOrDefault(); resultado = resultado && Cabecas.Select(a => a.Item1.ID).Contains(temp.Cabeca.ID); if (resultado) { confianca *= Cabecas.Where(a => a.Item1.ID == temp.Cabeca.ID).SingleOrDefault().Item2; } } catch (Exception) { } try { ListaOU temp = Regra.Ou.Where(a => a.Pos == i).SingleOrDefault(); resultado = resultado || Cabecas.Select(a => a.Item1.ID).Contains(temp.Cabeca.ID); double aux = Cabecas.Where(a => a.Item1.ID == temp.Cabeca.ID).SingleOrDefault().Item2; if (resultado) { confianca = (confianca + aux) - (confianca * aux); } } catch (Exception) { } } if (resultado) { Aplicar(Regra, confianca); } }