コード例 #1
0
        public override void Handle(Obstacle element, ParsedRefinedByAttribute attribute, KAOSModel model)
        {
            var refinement = new ObstacleRefinement(model);

            refinement.SetParentObstacle(element);

            // Parse the reference to children
            foreach (var child in attribute.ParsedRefinees)
            {
                var id    = child.Identifier;
                var param = child.Parameters;
                IRefineeParameter refineeParameter = null;

                if (param != null)
                {
                    if (param is ParsedPrimitiveRefineeParameter <double> )
                    {
                        var cast = ((ParsedPrimitiveRefineeParameter <double>)param);
                        refineeParameter = new PrimitiveRefineeParameter <double> (cast.Value);
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }

                Obstacle         refinee;
                DomainProperty   domprop;
                DomainHypothesis domhyp;

                if ((refinee = model.obstacleRepository.GetObstacle(id)) != null)
                {
                    refinement.Add(refinee, refineeParameter);
                }
                else if ((domprop = model.domainRepository.GetDomainProperty(id)) != null)
                {
                    refinement.Add(domprop, refineeParameter);
                }
                else if ((domhyp = model.domainRepository.GetDomainHypothesis(id)) != null)
                {
                    refinement.Add(domhyp, refineeParameter);
                }
                else
                {
                    refinee = new Obstacle(model, id)
                    {
                        Implicit = true
                    };
                    model.obstacleRepository.Add(refinee);
                    refinement.Add(refinee);
                }
            }

            if (!refinement.IsEmpty)
            {
                model.Add(refinement);
            }
        }
コード例 #2
0
        private static void AssertParameter(GoalRefinement refinement, string goalId, double expected)
        {
            IRefineeParameter p1 = refinement.SubGoalIdentifiers.Single(x => x.Identifier == goalId).Parameters;

            Assert.IsInstanceOf(typeof(PrimitiveRefineeParameter <double>), p1);
            var cp1 = (PrimitiveRefineeParameter <double>)p1;

            Assert.AreEqual(expected, cp1.Value);
        }
コード例 #3
0
 string ToString(IRefineeParameter param)
 {
     if (param != null)
     {
         return("[" + param.ToString() + "]");
     }
     else
     {
         return("");
     }
 }
コード例 #4
0
 DoubleSatisfactionRate ComputeRefineeSatisfactionRate(IEnumerable <GoalRefinee> refinees, Func <string, ISatisfactionRate> get)
 {
     return(refinees.Aggregate(
                DoubleSatisfactionRate.ZERO,
                (x, y) => {
         IRefineeParameter parameter = y.Parameters;
         if (!(parameter is PrimitiveRefineeParameter <double>))
         {
             throw new PropagationException(PropagationException.MISSING_PARAMETER);
         }
         var doubleParam = ((PrimitiveRefineeParameter <double>)parameter).Value;
         ISatisfactionRate sr = get(y.Identifier).Product(doubleParam);
         return (DoubleSatisfactionRate)x.Sum(sr);
     }
                ));
 }
コード例 #5
0
 public GoalRefinee(string identifier, IRefineeParameter parameters)
 {
     Identifier = identifier;
     Parameters = parameters;
 }
コード例 #6
0
 public void Add(DomainHypothesis domHyp, IRefineeParameter parameter)
 {
     this.DomainHypothesisIdentifiers.Add(new GoalRefinee(domHyp.Identifier, parameter));
 }
コード例 #7
0
 public void Add(DomainProperty domProp, IRefineeParameter parameter)
 {
     this.DomainPropertyIdentifiers.Add(new GoalRefinee(domProp.Identifier, parameter));
 }
コード例 #8
0
 public void Add(Goal goal, IRefineeParameter parameter)
 {
     this.SubGoalIdentifiers.Add(new GoalRefinee(goal.Identifier, parameter));
 }
コード例 #9
0
 public void Add(Obstacle obstacle, IRefineeParameter parameter)
 {
     this.SubobstacleIdentifiers.Add(new ObstacleRefinee(obstacle.Identifier, parameter));
 }
コード例 #10
0
 public ObstacleRefinee(string identifier, IRefineeParameter parameters)
 {
     Identifier = identifier;
     Parameters = parameters;
 }
コード例 #11
0
        public override void Handle(Goal element, ParsedRefinedByAttribute attribute, KAOSModel model)
        {
            var refinement = new GoalRefinement(model);

            refinement.SetParentGoal(element);

            // Parse the reference to children
            foreach (var child in attribute.ParsedRefinees)
            {
                var id    = child.Identifier;
                var param = child.Parameters;
                IRefineeParameter refineeParameter = null;

                if (param != null)
                {
                    if (param is ParsedPrimitiveRefineeParameter <double> )
                    {
                        var cast = ((ParsedPrimitiveRefineeParameter <double>)param);
                        refineeParameter = new PrimitiveRefineeParameter <double> (cast.Value);
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }

                Goal             refinee;
                DomainProperty   domprop;
                DomainHypothesis domhyp;

                if ((refinee = model.goalRepository.GetGoal(id)) != null)
                {
                    refinement.Add(refinee, refineeParameter);
                }
                else if ((domprop = model.domainRepository.GetDomainProperty(id)) != null)
                {
                    refinement.Add(domprop, refineeParameter);
                }
                else if ((domhyp = model.domainRepository.GetDomainHypothesis(id)) != null)
                {
                    refinement.Add(domhyp, refineeParameter);
                }
                else
                {
                    refinee = new Goal(model, id)
                    {
                        Implicit = true
                    };
                    model.goalRepository.Add(refinee);
                    refinement.Add(refinee);
                }
            }

            // Parse the context
            if (!string.IsNullOrEmpty(attribute.ContextIdentifier))
            {
                var     id = attribute.ContextIdentifier;
                Context context;

                if ((context = model.modelMetadataRepository.GetContext(id)) == null)
                {
                    context = new Context(model, id);
                    model.modelMetadataRepository.Add(context);
                }

                refinement.ContextIdentifier = context.Identifier;
            }

            // Parse the refinement pattern provided
            if (attribute.RefinementPattern != null)
            {
                if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.Milestone)
                {
                    refinement.RefinementPattern = RefinementPattern.Milestone;
                }

                else if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.Case)
                {
                    refinement.RefinementPattern = RefinementPattern.Case;
                }

                else if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.IntroduceGuard)
                {
                    refinement.RefinementPattern = RefinementPattern.IntroduceGuard;
                }

                else if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.DivideAndConquer)
                {
                    refinement.RefinementPattern = RefinementPattern.DivideAndConquer;
                }

                else if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.Uncontrollability)
                {
                    refinement.RefinementPattern = RefinementPattern.Uncontrollability;
                }

                else if (attribute.RefinementPattern.Name == ParsedRefinementPatternName.Unmonitorability)
                {
                    refinement.RefinementPattern = RefinementPattern.Unmonitorability;
                }

                else
                {
                    throw new BuilderException("Unsupported pattern " + refinement.RefinementPattern, attribute);
                }
            }

            if (!refinement.IsEmpty)
            {
                model.Add(refinement);
            }
        }