Beispiel #1
0
        private static void buildReWritingVariables(KPsystem kpSystem, KpCore.MType kpType, NuSMV.Module module, int strategyIndex, KpCore.Rule kpRule)
        {
            RewritingRule  rwr     = (RewritingRule)kpRule;
            string         varName = "";
            VariableOrigin origin  = VariableOrigin.Original;
            bool           isLeft  = true;

            foreach (var leftHRule in rwr.Lhs)
            {
                varName = leftHRule.Key;
                origin  = VariableOrigin.Original;
                isLeft  = true;
                buildReWritingVariable(kpSystem, kpType, module, strategyIndex, kpRule, varName, origin, isLeft);
            }
            foreach (var rigthHRule in rwr.Rhs)
            {
                varName = rigthHRule.Key;
                origin  = VariableOrigin.Original;
                isLeft  = false;
                //first generate original one, then its copy
                if (!module.isVariableExist(varName))
                {
                    buildReWritingVariable(kpSystem, kpType, module, strategyIndex, kpRule, varName, origin, isLeft);
                }
                string copyVarName = varName + SMVPreFix.COPY;
                origin = VariableOrigin.Copy;
                buildReWritingVariable(kpSystem, kpType, module, strategyIndex, kpRule, copyVarName, origin, isLeft);
            }
        }
        public object VisitRuleRightHandSide(KpLinguaParser.RuleRightHandSideContext context)
        {
            var rule = default(ConsumerRule);

            var ruleMultisetContexts   = context.ruleMultiset();
            var divisionContexts       = context.division();
            var dissolutionContext     = context.dissolution();
            var linkCreationContext    = context.linkCreation();
            var linkDestructionContext = context.linkDestruction();

            if (ruleMultisetContexts != null)
            {
                var rewritingRule = default(RewritingRule);

                if (ruleMultisetContexts.Any(rm => rm.targetedMultiset() != null))
                {
                    var rewriteCommunicationRule = new RewriteCommunicationRule();
                    var targetedMultisets        = ruleMultisetContexts.Where(rm => rm.targetedMultiset() != null).Select(rm => rm.targetedMultiset().Accept(this) as TargetedMultiset);
                    rewriteCommunicationRule.AddRhs(targetedMultisets.ToDictionary(tm => tm.Target));

                    rewritingRule = rewriteCommunicationRule;
                }
                else
                {
                    rewritingRule = new RewritingRule();
                }

                var multisets = ruleMultisetContexts.Where(rm => rm.nonEmptyMultiset() != null).Select(rm => rm.nonEmptyMultiset().Accept(this) as Multiset);
                foreach (var multiset in multisets)
                {
                    rewritingRule.AddRhs(multiset);
                }

                rule = rewritingRule;
            }
            else if (divisionContexts != null)
            {
                var divisionRule = new DivisionRule();

                foreach (var divisionContext in divisionContexts)
                {
                    divisionRule.Rhs.Add(divisionContext.Accept(this) as InstanceBlueprint);
                }

                rule = divisionRule;
            }
            else if (dissolutionContext != null)
            {
                rule = dissolutionContext.Accept(this) as DissolutionRule;
            }
            else if (linkCreationContext != null)
            {
            }
            else if (linkDestructionContext != null)
            {
            }

            return(rule);
        }
Beispiel #3
0
        private static IExp resultOfReWritingRule(KpCore.Rule kpRule, Variable variable)
        {
            OperExp       result = new OperExp();
            int           value  = 0;//value of the variable
            RewritingRule rwr    = null;

            if (kpRule.Type == RuleType.MULTISET_REWRITING)
            {
                rwr = (RewritingRule)kpRule;
            }
            else if (kpRule.Type == RuleType.REWRITE_COMMUNICATION)
            {
                rwr = (RewriteCommunicationRule)kpRule;
            }
            string orijinalVarName = variable.Name.Replace(SMVPreFix.COPY, "");

            if (variable.Origin == VariableOrigin.Original || variable.Origin == VariableOrigin.OriginalCommVar)
            {
                result.Oper.Value = MathOper.SUB;
                foreach (var leftHRule in rwr.Lhs)
                {
                    if (leftHRule.Key.Equals(orijinalVarName))
                    {
                        value += leftHRule.Value;
                    }
                }
            }
            else if (variable.Origin == VariableOrigin.Copy || variable.Origin == VariableOrigin.CopyOfCommVar)
            {
                result.Oper.Value = MathOper.ADD;
                foreach (var rigthHRule in rwr.Rhs)
                {
                    if (rigthHRule.Key.Equals(orijinalVarName))
                    {
                        value += rigthHRule.Value;
                    }
                }
            }
            result.Exp    = variable.Name;
            result.Result = new Expression(value.ToString());

            return(result);
        }
Beispiel #4
0
        private void writeRule(Rule rule)
        {
            owt.Write("{");
            bool pItem = writePItem(rule);

            if (!rule.IsEmpty())
            {
                if (pItem)
                {
                    owt.Write(", ");
                }

                if (rule.IsGuarded)
                {
                    owt.Write("\"guard\":");
                    writeGuard(rule.Guard);
                    owt.Write(", ");
                }

                if (rule.Type == RuleType.CONSUMER)
                {
                    owt.Write("\"lhs\":");
                    writeMultiset((rule as ConsumerRule).Lhs);
                }
                else if (rule.Type == RuleType.MULTISET_REWRITING)
                {
                    RewritingRule r = rule as RewritingRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(", \"rhs\":");
                    writeMultiset(r.Rhs);
                }
                else if (rule.Type == RuleType.REWRITE_COMMUNICATION)
                {
                    RewriteCommunicationRule r = rule as RewriteCommunicationRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(", \"rhs\":");
                    writeMultiset(r.Rhs);
                    owt.Write(", \"targetRhs\":[");
                    int i = 1;
                    foreach (TargetedMultiset tm in r.TargetRhs.Values)
                    {
                        writeTargetedMultiset(tm);
                        if (i++ < r.TargetRhs.Count)
                        {
                            owt.Write(", ");
                        }
                    }
                    owt.Write("]");
                }
                else if (rule.Type == RuleType.MEMBRANE_DIVISION)
                {
                    DivisionRule r = rule as DivisionRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(", \"instances\":[");
                    int i = 1;
                    foreach (InstanceBlueprint ib in r.Rhs)
                    {
                        writeInstanceBlueprint(ib);
                        if (i++ < r.Rhs.Count)
                        {
                            owt.Write(", ");
                        }
                    }
                    owt.Write("]");
                }
                else if (rule.Type == RuleType.LINK_CREATION)
                {
                    LinkRule r = rule as LinkRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(",\"linkCreate\":");
                    writeInstanceIdentifier(r.Target);
                }
                else if (rule.Type == RuleType.LINK_DESTRUCTION)
                {
                    LinkRule r = rule as LinkRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(",\"linkDestroy\":");
                    writeInstanceIdentifier(r.Target);
                }
                else if (rule.Type == RuleType.MEMBRANE_DISSOLUTION)
                {
                    DissolutionRule r = rule as DissolutionRule;
                    owt.Write("\"lhs\":");
                    writeMultiset(r.Lhs);
                    owt.Write(", \"dissolve\": true");
                }
            }

            owt.Write("}");
        }
        private Rule readRule(XPathNavigator nav)
        {
            ConsumerRule rule = null;

            XPathNavigator rhsNav = nav.SelectSingleNode("rhs");

            if (rhsNav != null)
            {
                Multiset          m = readMultiset(rhsNav);
                XPathNodeIterator div;
                if (m.IsEmpty())
                {
                    //then we can have structure changing rules
                    div = rhsNav.SelectChildren("instance", String.Empty);
                    if (div.Count > 0)
                    {
                        DivisionRule r = new DivisionRule();
                        while (div.MoveNext())
                        {
                            string            mtype = div.Current.GetAttribute("mtype", String.Empty);
                            InstanceBlueprint ib    = null;
                            if (String.IsNullOrEmpty(mtype))
                            {
                                ib = new InstanceBlueprint(currentType);
                            }
                            else
                            {
                                ib = new InstanceBlueprint(kp[mtype]);
                            }
                            readMultiset(div.Current, ib.Multiset);
                            r.Rhs.Add(ib);
                        }
                        rule = r;
                    }
                    else
                    {
                        XPathNavigator v;
                        v = rhsNav.SelectSingleNode("linkCreate");
                        if (v == null)
                        {
                            v = rhsNav.SelectSingleNode("linkDestroy");
                            if (v == null)
                            {
                                v = rhsNav.SelectSingleNode("dissolve");
                                if (v != null)
                                {
                                    rule = new DissolutionRule();
                                }
                            }
                            else
                            {
                                rule = LinkRule.LinkDestroy(readInstanceIdentifier(v));
                            }
                        }
                        else
                        {
                            rule = LinkRule.LinkCreate(readInstanceIdentifier(v));
                        }
                    }
                }

                if (rule == null)
                {
                    div = rhsNav.SelectChildren("target", String.Empty);
                    if (div.Count > 0)
                    {
                        RewriteCommunicationRule rcr = new RewriteCommunicationRule();
                        rcr.Rhs.Add(m);
                        while (div.MoveNext())
                        {
                            TargetedMultiset tm  = readTargetedMultiset(div.Current);
                            TargetedMultiset otm = null;
                            rcr.TargetRhs.TryGetValue(tm.Target, out otm);
                            if (otm == null)
                            {
                                rcr.TargetRhs.Add(tm.Target, tm);
                            }
                            else
                            {
                                otm.Multiset.Add(tm.Multiset);
                            }
                        }
                        rule = rcr;
                    }
                    else if (m != null)
                    {
                        rule = new RewritingRule();
                        (rule as RewritingRule).Rhs.Add(m);
                    }
                }
            }

            if (rule == null)
            {
                rule = new ConsumerRule();
            }
            readPItem(nav, rule);
            rule.Guard = readGuard(nav.SelectSingleNode("guard"));
            readMultiset(nav.SelectSingleNode("lhs"), rule.Lhs);

            return(rule);
        }
Beispiel #6
0
        /// <summary>
        /// if variable has NOT been set by XML file then set max automatically
        /// </summary>
        /// <param name="kpSystem"></param>
        /// <param name="myType"></param>
        /// <param name="module"></param>
        /// <param name="variable"></param>
        /// <returns></returns>
        private static int setMax(KPsystem kpSystem, MType myType, NuSMV.Module module, IVar variable)
        {
            int maxVal = 0;

            foreach (var type in kpSystem.Types)
            {
                ExecutionStrategy eS = type.ExecutionStrategy;
                while (eS != null)
                {
                    //Inside this type
                    if (myType.Name.Equals(type.Name))
                    {
                        foreach (var rule in eS.Rules)
                        {
                            //Normal variable
                            if (rule.Type == RuleType.MULTISET_REWRITING)
                            {
                                RewritingRule rwr = (RewritingRule)rule;
                                foreach (var leftHRule in rwr.Lhs)
                                {
                                    if (variable.Name.Equals(leftHRule.Key))
                                    {
                                        maxVal = Math.Max(maxVal, leftHRule.Value);
                                    }
                                }
                                foreach (var rigthHRule in rwr.Rhs)
                                {
                                    if (variable.Name.Equals(rigthHRule.Key))
                                    {
                                        maxVal = Math.Max(maxVal, rigthHRule.Value);
                                    }
                                }
                            }
                            // Communication Var
                            else if (rule.Type == RuleType.REWRITE_COMMUNICATION)
                            {
                                RewriteCommunicationRule rcr = (RewriteCommunicationRule)rule;
                                foreach (var leftHRule in rcr.Lhs)
                                {
                                    if (variable.Name.Equals(leftHRule.Key))
                                    {
                                        maxVal = Math.Max(maxVal, leftHRule.Value);
                                    }
                                }
                            }
                            else if (rule.Type == RuleType.MEMBRANE_DIVISION)
                            {
                                DivisionRule divisionRule = (DivisionRule)rule;
                                foreach (var leftHRule in divisionRule.Lhs)
                                {
                                    if (variable.Name.Equals(leftHRule.Key))
                                    {
                                        maxVal = Math.Max(maxVal, leftHRule.Value);
                                    }
                                }
                                foreach (InstanceBlueprint compartment in divisionRule.Rhs)
                                {
                                    MType compType = compartment.Type;
                                    if (myType.Name.Equals(compType.Name))
                                    {
                                        Multiset ms = compartment.Multiset;
                                        foreach (var obj in ms.Objects)
                                        {
                                            if (variable.Name.Equals(obj))
                                            {
                                                maxVal = Math.Max(maxVal, ms[obj]);
                                            }
                                        }
                                    }
                                }
                            }
                            else if (rule.Type == RuleType.MEMBRANE_DISSOLUTION)
                            {
                                DissolutionRule dissolutionRule = (DissolutionRule)rule;
                                foreach (var leftHRule in dissolutionRule.Lhs)
                                {
                                    if (variable.Name.Equals(leftHRule.Key))
                                    {
                                        maxVal = Math.Max(maxVal, leftHRule.Value);
                                    }
                                }
                            }
                        }
                    }
                    //Inside communication rule of other types
                    else
                    {
                        foreach (var rule in eS.Rules)
                        {
                            if (rule.Type == RuleType.REWRITE_COMMUNICATION)
                            {
                                RewriteCommunicationRule rcr = (RewriteCommunicationRule)rule;
                                foreach (var target in rcr.TargetRhs.Values)
                                {
                                    TargetedMultiset   tg         = (TargetedMultiset)target;
                                    InstanceIdentifier identifier = (InstanceIdentifier)tg.Target;
                                    if (myType.Name.Equals(identifier.Value))
                                    {
                                        Multiset ms = tg.Multiset;
                                        foreach (var rightVar in ms.Objects)
                                        {
                                            if (variable.Name.Equals(rightVar))
                                            {
                                                maxVal = Math.Max(maxVal, ms[rightVar]);
                                            }
                                        }
                                    }
                                }
                            }
                            else if (rule.Type == RuleType.MEMBRANE_DIVISION)
                            {
                                DivisionRule divisionRule = (DivisionRule)rule;
                                foreach (InstanceBlueprint compartment in divisionRule.Rhs)
                                {
                                    MType compType = compartment.Type;
                                    if (myType.Name.Equals(compType.Name))
                                    {
                                        Multiset ms = compartment.Multiset;
                                        foreach (var obj in ms.Objects)
                                        {
                                            if (variable.Name.Equals(obj))
                                            {
                                                maxVal = Math.Max(maxVal, ms[obj]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    eS = eS.Next;
                }
                //also compare parameter values
                foreach (var instance in type.Instances)
                {
                    foreach (var param in instance.Multiset.Objects)
                    {
                        if (variable.Name.Equals(param))
                        {
                            maxVal = Math.Max(maxVal, instance.Multiset[param]);
                        }
                    }
                }
            }
            return(maxVal);
        }