Пример #1
0
        public static Knowledge Initialize(Cdn.Network network)
        {
            if (s_instance == null || s_instance.Network != network)
            {
                s_instance = new Knowledge(network);
                s_instance.Init();
            }

            return(s_instance);
        }
Пример #2
0
        public void Generate()
        {
            Profile.Do("load network", () => {
                LoadNetwork();
            });

            if (Options.Instance.Validate)
            {
                d_validator = new Validator(d_network);
            }

            if (Options.Instance.DelayTimeStep > 0)
            {
                Cdn.Expression    expr  = new Cdn.Expression(Options.Instance.DelayTimeStep.ToString("R"));
                Cdn.Instruction[] instr = new Cdn.Instruction[1];
                instr[0]          = new Cdn.InstructionNumber(Options.Instance.DelayTimeStep);
                expr.Instructions = instr;

                d_network.Integrator.AddVariable(new Cdn.Variable("delay_dt", expr, Cdn.VariableFlags.Out));
            }

            Profile.Do("initialize knowledge", () => {
                // Initialize the knowledge
                Knowledge.Initialize(d_network);
            });

            if (!Options.Instance.NoSparsity)
            {
                Profile.Do("sparsity", () => {
                    var sparsity = new Sparsity();
                    sparsity.Optimize();
                });
            }

            var t = Profile.Begin("collect");

            // Collect all the equations
            Tree.Collectors.Result collection = Collect();

            t.End();

            t = Profile.Begin("filter");

            // Filter conflicts and resolve final embeddings
            Tree.Embedding[] embeddings = Filter(collection);

            t.End();

            t = Profile.Begin("resolve equations");

            // Resolve final equations
            Dictionary <State, Tree.Node> equations = ResolveEquations(embeddings);

            t.End();

            // Create program
            t = Profile.Begin("create program");

            Programmer.Program program = new Programmer.Program(ProgrammerOptions(), embeddings, equations);

            t.End();

            bool outistemp = false;

            // Write program
            if (Options.Instance.Validate || Options.Instance.Compile)
            {
                // Create a new temporary directory for the output files
                string path = Path.GetTempFileName();
                File.Delete(path);

                Directory.CreateDirectory(path);
                program.Options.Output = path;

                outistemp = true;
            }
            else
            {
                Directory.CreateDirectory(program.Options.Output);
            }

            t = Profile.Begin("write program");

            d_writtenFiles = Options.Instance.Formatter.Write(program);

            t.End();

            if (Options.Instance.PrintCompileSource)
            {
                foreach (string filename in d_writtenFiles)
                {
                    Console.WriteLine("File: {0}", filename);
                    Console.WriteLine(File.ReadAllText(filename));
                }
            }

            if (Options.Instance.Validate && !Options.Instance.PrintCompileSource)
            {
                try
                {
                    d_validator.Validate(program, d_writtenFiles);
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine(e.Message);

                    Directory.Delete(program.Options.Output, true);
                    Environment.Exit(1);
                }
            }
            else if (Options.Instance.Compile)
            {
                var files = Options.Instance.Formatter.Compile(Options.Instance.Verbose);

                if (Options.Instance.Verbose)
                {
                    Log.WriteLine("Compiled {0}...", String.Join(", ", Array.ConvertAll <string, string>(files, a => Path.GetFileName(a))));
                }

                if (!String.IsNullOrEmpty(Options.Instance.Output))
                {
                    try
                    {
                        Directory.CreateDirectory(Options.Instance.Output);
                    }
                    catch
                    {
                    }
                }

                foreach (var f in files)
                {
                    var dest = Path.GetFileName(f);

                    if (!String.IsNullOrEmpty(Options.Instance.Output))
                    {
                        dest = Path.Combine(Options.Instance.Output, dest);
                    }

                    try
                    {
                        File.Delete(dest);
                    } catch {}

                    File.Move(f, dest);
                }
            }

            if (outistemp)
            {
                try
                {
                    Directory.Delete(program.Options.Output, true);
                } catch {};
            }
        }