Пример #1
0
 public Predecessor(List <LTerm> leftContext, List <LTerm> rightContext, LTerm term, string condition = null)
 {
     m_listLeftContext  = leftContext;
     m_listRightContext = rightContext;
     m_term             = term;
     m_strCondition     = condition;
 }
Пример #2
0
    private string m_strCondition;           //产生条件

    /*
     * 构造函数,创建前驱
     * 构造函数包括:
     * ①唯一的模块(LTerm形式)与产生条件(string形式,可忽略)
     * ②左右上下文(List<LTerm>形式)、唯一的模块(LTerm形式)与产生条件(string形式,可忽略)
     */
    #region 构建函数
    public Predecessor(LTerm term = null, string condition = null)
    {
        m_listLeftContext  = new List <LTerm>();
        m_listRightContext = new List <LTerm>();
        m_term             = term;
        m_strCondition     = condition;
    }
Пример #3
0
    public void AddLeftContext(LTerm ContextTerm)
    {
        if (m_listLeftContext == null)
        {
            m_listLeftContext = new List <LTerm>();
        }

        m_listLeftContext.Add(ContextTerm);
    }
Пример #4
0
    private bool isIgnored(LTerm term)
    {
        if (m_RuleDataEntry.Ignore == null)
        {
            return(false);
        }

        return(m_RuleDataEntry.Ignore.Exists(MatchTerm => MatchTerm.Symbol.Equals(term.Symbol)));
    }
Пример #5
0
    /// <summary>
    /// 根据含有形参的Term以及各实参计算出最终的Term并返回。
    /// 如 F(length+1) 为含有形参的Term,length 为 1,则返回F(2)
    /// </summary>
    /// <param name="scrTerm">含有形参的Term,如F(length+1)</param>
    /// <param name="table">包含各实参的DataTable类</param>
    /// <returns>返回计算完成后的Term</returns>
    private LTerm GetResultTerm(LTerm scrTerm, DataTable table)
    {
        if (scrTerm == null)
        {
            return(null);
        }

        LTerm destTerm = new LTerm();

        destTerm.Symbol = scrTerm.Symbol;                                  //将符号赋值给新的term

        table.Rows[table.Rows.Count - 1]["RANDOM"] = RandomNumer.Single(); //写入随机数

        for (int i = 0; i < scrTerm.Params.Count; i++)
        {
            table.Columns["expression"].Expression = scrTerm.Params[i];             //根据参数中的公式进行赋值,如F(length + 1)中的length + 1
            destTerm.Params.Add(table.Rows[0][table.Columns.Count - 1].ToString()); //根据实参、公式计算出结果,并赋值给输出的term中的参数列表
        }

        return(destTerm);
    }
Пример #6
0
    /// <summary>
    /// 根据输入的参数输出该产生式产生的结果链表。
    /// 如该产生式为 F(length)-->F(length+1)A(length),输入的参数为1,则输出的结果为F(2)A(1)
    /// </summary>
    /// <param name="node">当前的节点,用于确定其上下文</param>
    /// <param name="inputParams">输入的参数,用于计算,且个数一定要与前驱中的形参的个数相同</param>
    /// <returns>返回最终产生的结果链表</returns>
    public LLinkedList <LTerm> GetResultList(LLinkedListNode <LTerm> node, params float[] inputParams)
    {
        Validate();
        ValidateInputParams(inputParams);

        List <LTerm> FinalLeftContext, FinalRightLeftContext;

        if (!isContextual(node, out FinalLeftContext, out FinalRightLeftContext))    //不满足上下文的条件
        {
            return(null);
        }

        LLinkedList <LTerm> result = new LLinkedList <LTerm>(); //存储最终产生的结果

        DataTable table = new DataTable();                      //用于计算各参数 参考代码:https://www.cnblogs.com/luther/p/3863274.html

        //添加形参及公式
        table.BeginLoadData();

        //添加全局变量形参
        List <VariableEntry> GlobalVariablesList = m_RuleDataEntry.GlobalVariablesList; //获取全局变量的链表

        for (int i = 0; i < GlobalVariablesList.Count; i++)
        {
            GlobalVariablesList[i].Validate();                             //验证该全局变量是否可用
            table.Columns.Add(GlobalVariablesList[i].Name, typeof(float)); //添加全局变量列
        }

        table.Columns.Add("RANDOM", typeof(float));     //添加随机变量列

        //添加Mesh形参
        List <Mesh> Meshs = (m_RuleDataEntry.Belong).Meshes;  //获取存放所有Mesh的链表

        for (int i = 0; i < Meshs.Count; i++)
        {
            table.Columns.Add(Meshs[i].Name, typeof(int));
        }

        //添加输入参数的形参
        for (int i = 0; i < m_Predecessor.Term.Params.Count; i++)
        {
            table.Columns.Add(m_Predecessor.Term.Params[i], typeof(float)); //添加形参列
        }

        //添加上下文参数的形参
        foreach (LTerm term in m_Predecessor.LeftContext)    //添加左侧上下文的形参
        {
            for (int i = 0; i < term.Params.Count; i++)
            {
                table.Columns.Add(term.Params[i], typeof(float));
            }
        }

        foreach (LTerm term in m_Predecessor.RightContext)   //添加右侧上下文的形参
        {
            for (int i = 0; i < term.Params.Count; i++)
            {
                table.Columns.Add(term.Params[i], typeof(float));
            }
        }

        //添加公式列
        table.Columns.Add("expression", typeof(float));
        table.Columns["expression"].Expression = "";


        //添加实参
        DataRow row = table.Rows.Add();

        for (int i = 0; i < GlobalVariablesList.Count; i++)
        {
            row[GlobalVariablesList[i].Name] = GlobalVariablesList[i].Value;    //添加全局变量的实参
        }

        for (int i = 0; i < Meshs.Count; i++)
        {
            row[Meshs[i].Name] = Meshs[i].NameValue;
        }

        for (int i = 0; i < m_Predecessor.Term.Params.Count; i++)
        {
            row[m_Predecessor.Term.Params[i]] = inputParams[i];     //添加输入参数的实参
        }

        //添加上下文的实参
        for (int i = 0; i < FinalLeftContext.Count; i++)
        {
            for (int j = 0; j < FinalLeftContext[i].Params.Count; j++)
            {
                row[m_Predecessor.LeftContext[i].Params[j]] = FinalLeftContext[i].Params[j];
            }
        }

        for (int i = 0; i < FinalRightLeftContext.Count; i++)
        {
            for (int j = 0; j < FinalRightLeftContext[i].Params.Count; j++)
            {
                row[m_Predecessor.RightContext[i].Params[j]] = FinalRightLeftContext[i].Params[j];
            }
        }

        //判断是否满足条件
        if (!MeetTheConditions(table))
        {
            return(null);
        }

        if (m_listSuccessor.Count > 1)  //有多个不同概率的后续
        {
            //根据概率选择一个后续
            m_iSuccessorIndex = RandomlySelectResultList();
        }

        //根据选择的后续,逐个计算term,输出单一的term,并添加到结果链表中
        LLinkedListNode <LTerm> srcNode = m_listSuccessor[m_iSuccessorIndex].Result.First;

        do
        {
            LTerm destTerm = GetResultTerm(srcNode.Value, table); //获取最终的单个term
            result.Add(destTerm);                                 //插入Term

            srcNode = srcNode.Next;                               //移动到下一个节点
        } while (srcNode != m_listSuccessor[m_iSuccessorIndex].Result.First);

        table.EndLoadData();
        table.Clear();

        return(result);
    }
Пример #7
0
 public void AddRightContext(LTerm ContextTerm)
 {
     m_Predecessor.AddRightContext(ContextTerm);
 }
Пример #8
0
    /// <summary>
    /// 往产生式中添加前驱(前驱唯一)
    /// </summary>
    /// <param name="statement">前驱的语句,如F(length)</param>
    public void AddPredecessor(string statement)
    {
        LTerm term = new LTerm(statement);

        m_Predecessor.Term = term;
    }
Пример #9
0
    /// <summary>
    /// 往产生式中添加前驱(前驱唯一)
    /// </summary>
    /// <param name="symbol">前驱的符号</param>
    /// <param name="para">前驱的参数</param>
    public void AddPredecessor(string symbol, List <string> para)
    {
        LTerm term = new LTerm(symbol, para);

        m_Predecessor.Term = term;
    }
Пример #10
0
    /// <summary>
    /// 往产生式中添加前驱(前驱唯一)
    /// </summary>
    /// <param name="symbol">前驱的符号</param>
    /// <param name="para">前驱的参数</param>
    public void AddPredecessor(string symbol, params string[] para)
    {
        LTerm term = new LTerm(symbol, new List <string>(para));

        m_Predecessor.Term = term;
    }
Пример #11
0
 /// <summary>
 /// 往产生式中添加前驱(前驱唯一)
 /// </summary>
 /// <param name="predecessor"></param>
 public void AddPredecessor(LTerm predecessor)
 {
     m_Predecessor.Term = predecessor;
 }
Пример #12
0
 public LRule(LTerm stTerm, string strCondition, float fProbability, LLinkedList <LTerm> lstResult)
 {
     m_Predecessor        = new Predecessor(stTerm, strCondition);
     this.m_listSuccessor = new List <Successor>();
     m_listSuccessor.Add(new Successor(fProbability, lstResult));
 }
Пример #13
0
 public LRule(LTerm stTerm, LLinkedList <LTerm> lstResult)
 {
     m_Predecessor        = new Predecessor(stTerm);
     this.m_listSuccessor = new List <Successor>();
     m_listSuccessor.Add(new Successor(lstResult));
 }