Beispiel #1
0
        Predicate GetOrCreatePredicate(ParsedPredicateReferenceExpression parsedPred,
                                       Dictionary <string, KAOSTools.Core.Entity> declarations)
        {
            var       idOrName = parsedPred.PredicateSignature;
            Predicate predicate;

            if (idOrName is NameExpression)
            {
                predicate = model.Predicates().SingleOrDefault(t => t.Name == idOrName.Value);
            }
            else if (idOrName is IdentifierExpression)
            {
                predicate = model.Predicates().SingleOrDefault(t => t.Identifier == idOrName.Value);
            }
            else
            {
                throw new NotImplementedException(idOrName.GetType().Name + " is not yet supported");
            }

            if (predicate == null)
            {
                if (idOrName is NameExpression)
                {
                    predicate = new Predicate(model)
                    {
                        Name = idOrName.Value, Implicit = true
                    }
                }
                ;
                else if (idOrName is IdentifierExpression)
                {
                    predicate = new Predicate(model)
                    {
                        Identifier = idOrName.Value, Implicit = true
                    }
                }
                ;
                else
                {
                    throw new NotImplementedException();
                }

                foreach (var arg in parsedPred.ActualArguments)
                {
                    predicate.Arguments.Add(new PredicateArgument()
                    {
                        Name = arg, Type = declarations[arg]
                    });
                }

                model.Add(predicate);
            }
            else
            {
                // Check that same number of arguments are used (if none is already declared)
                if (predicate.Arguments.Count > 0 && parsedPred.ActualArguments.Count != predicate.Arguments.Count)
                {
                    throw new BuilderException("Predicate '" + idOrName.Value + "' arguments mismatch. " +
                                               "Expect " + predicate.Arguments.Count + " arguments but " + parsedPred.ActualArguments.Count + " received.",
                                               parsedPred.Filename, parsedPred.Line, parsedPred.Col);
                }
                else
                {
                    // Check that arguments match the declared type (if none is already declared)
                    if (predicate.Arguments.Count > 0)
                    {
                        for (int i = 0; i < parsedPred.ActualArguments.Count; i++)
                        {
                            var parsedArg = parsedPred.ActualArguments[i];
                            if (!declarations[parsedArg].Ancestors().Contains(predicate.Arguments[i].Type))
                            {
                                throw new BuilderException("Predicate '" + idOrName + "' arguments mismatch. " +
                                                           "Argument '" + parsedArg + "' is type '" + declarations[parsedArg].FriendlyName + "' " +
                                                           "but type '" + predicate.Arguments[i].Type.FriendlyName + "' is expected. Make sure that you do not mix names and identifiers.",
                                                           parsedPred.Filename, parsedPred.Line, parsedPred.Col);
                            }
                        }
                    }

                    // Otherwise, create all needed arguments
                    else
                    {
                        for (int i = 0; i < parsedPred.ActualArguments.Count; i++)
                        {
                            var parsedArg = parsedPred.ActualArguments[i];
                            predicate.Arguments.Add(new PredicateArgument()
                            {
                                Name = parsedArg,
                                Type = declarations[parsedArg]
                            });
                        }
                    }
                }
            }

            return(predicate);
        }
Beispiel #2
0
        public static void Main(string[] args)
        {
            //DeployAmbulanceAtStationAllocator();
            //Thread.Sleep(TimeSpan.FromSeconds(10));

            Console.WriteLine("Hello World!");
            var monitoringDelay = TimeSpan.FromSeconds(1);

            logger.Info("Connecting to database");
            var provider         = new PostgreSQLDatabaseProvider();
            var connectionString = ConfigurationManager.ConnectionStrings["postgres"].ConnectionString;

            var config = DatabaseConfiguration.Build()
                         .UsingConnectionString(connectionString)
                         .UsingProvider(provider)
                         .UsingDefaultMapper <ConventionMapper>();

            db = new Database(config);
            incidentRepository      = new IncidentRepository(db);
            ambulanceRepository     = new AmbulanceRepository(db);
            allocationRepository    = new AllocationRepository(db);
            hospitalRepository      = new HospitalRepository(db);
            configurationRepository = new ConfigurationRepository(db);
            logger.Info("Connected to database");

            logger.Info("Building KAOS model.");
            var filename = "./Models/simple.kaos";
            var parser   = new KAOSTools.Parsing.ModelBuilder();

            model = parser.Parse(File.ReadAllText(filename), filename);
            var model2 = parser.Parse(File.ReadAllText(filename), filename);

            ActiveResolutions = Enumerable.Empty <Resolution>();

            var declarations = parser.Declarations;

            logger.Info("(done)");

            logger.Info("Configuring monitors.");
            // Configure all the monitors (for all obstacles and domain properties).
            KAOSMetaModelElement[] goals     = model.Goals().ToArray();
            KAOSMetaModelElement[] obstacles = model.LeafObstacles().ToArray();
            var projection = new HashSet <string>(GetAllPredicates(goals));

            monitor = new GoalMonitor(model, goals.Union(obstacles), projection, HandleFunc,
                                      // new TimedStateInformationStorage(TimeSpan.FromMinutes(60), TimeSpan.FromMinutes(120)),
                                      monitoringDelay);
            logger.Info("(done)");

            foreach (var p in model.Predicates())
            {
                Console.WriteLine(p.FriendlyName);
            }

            // What goals and obstacles should appear in LOG
            cpsGoals     = model.Goals(x => x.CustomData.ContainsKey("log_cps"));
            cpsObstacles = model.Obstacles(x => x.CustomData.ContainsKey("log_cps"));

            // Initialize obstruction sets
            obstructionLock = new object();
            ComputeObstructionSets();

            Console.WriteLine("Waiting ...");
            Console.ReadKey();

            logger.Info("Launching monitors");
            monitor.Run(false);

            var goalMonitorProcessor = new GoalMonitorProcessor(monitor);

            csvExport = new CSVGoalExportProcessor("experiment-goal.csv", "experiment-obstacle.csv");
            // goalMonitorProcessor.AddProcessor(csvExport, monitoringDelay);

            new Timer((state) => UpdateCPS(), null, monitoringDelay, monitoringDelay);
            new Timer((state) => MonitorStep(), null, monitoringDelay, monitoringDelay);
            Thread.Sleep(TimeSpan.FromSeconds(5));
            logger.Info("Launching processors");
            //new Timer((state) => LogStatistic(), null, monitoringDelay, monitoringDelay);
            new Timer((state) => LogCSV(), null, monitoringDelay, monitoringDelay);

            // Configure optimization process.
            optimizer = new Optimizer(monitor, model2);
            new Timer((state) => Optimize(), null, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(60));

            while (true)
            {
                ;
            }
        }