Exemple #1
0
        public void ParseRepeatBlock()
        {
            JSProgram program = new JSProgram();

            program.AddInputBlock("k", 10);
            program.AddOutputDeclarationBlock("z");

            string conditionalBlock = program.AddConstantBlock(3);

            program.AddScope("a");
            program.SetScope("a");
            string guardedBlock = program.AddOutputSegment("k", "z", 1, false);

            program.SetScope(JSProgram.DEFAULT_SCOPE_NAME);

            program.AddRepeatSegment(conditionalBlock, guardedBlock);
            program.Finish();

            TestTools.ExecuteJS(program);
            string xml = TestTools.GetWorkspaceString();

            (CDFG cdfg, var _) = XmlParser.Parse(xml);

            Assert.AreEqual(2, cdfg.Nodes.Count);

            DFG <Block> firstDFG = cdfg.StartDFG;

            Assert.AreEqual(5, firstDFG.Nodes.Count);

            (var _, DFG <Block> lastDFG) = cdfg.Nodes.Where(x => x.dfg != firstDFG).Single();
            Assert.AreEqual(1, lastDFG.Nodes.Count);
        }
Exemple #2
0
        public void ScheduleOneSeqMixer(bool enableGC, bool enableOptimizations)
        {
            JSProgram program = new JSProgram();

            program.AddInputBlock("a", 10);
            program.AddInputBlock("b", 10);
            program.AddMixerSegment("c", "a", 1, false, "b", 1, false);
            program.Finish();

            (string, int)[] leftoverFluids = new (string, int)[]
Exemple #3
0
        public void ParseConstantBlock()
        {
            JSProgram program = new JSProgram();

            program.AddConstantBlock(210);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();
            Constant   constant   = (Constant)XmlParser.ParseBlock(node, null, parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.AreEqual(210, constant.Value);
        }
Exemple #4
0
        public void ParseHeaterDeclarationBlock()
        {
            JSProgram program = new JSProgram();

            program.AddHeaterDeclarationBlock("z");
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            HeaterDeclaration heater = (HeaterDeclaration)XmlParser.ParseBlock(node, null, parserInfo, true);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
        }
Exemple #5
0
        public void ParseFluidBlock()
        {
            JSProgram program = new JSProgram();

            program.AddFluidSegment("k", "a", 10, false);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            parserInfo.AddVariable("", VariableType.FLUID, "a");
            Fluid input = (Fluid)XmlParser.ParseBlock(node, new DFG <Block>(), parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
        }
Exemple #6
0
        public void ParseBoolOPBlock()
        {
            JSProgram program = new JSProgram();
            string    a       = program.AddConstantBlock(20);
            string    b       = program.AddConstantBlock(12);

            program.AddBoolOPBlock(BoolOPTypes.EQ, a, b);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();
            BoolOP     boolOP     = (BoolOP)XmlParser.ParseBlock(node, new DFG <Block>(), parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.AreEqual(BoolOPTypes.EQ, boolOP.OPType);
        }
Exemple #7
0
        public void ParseRandomDFG()
        {
            Random random = new Random(1280);

            for (int i = 0; i < 30; i++)
            {
                JSProgram program = new JSProgram();
                program.Render = false;
                program.CreateRandomDFG(30, random);
                TestTools.ExecuteJS(program);

                string xml = TestTools.GetWorkspaceString();
                XmlParser.Parse(xml);

                TestTools.ClearWorkspace();
            }
        }
Exemple #8
0
        public void ParseInputBlock()
        {
            JSProgram program = new JSProgram();

            program.AddInputBlock("a", 20);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            parserInfo.AddVariable("", VariableType.FLUID, "a");
            InputDeclaration input = (InputDeclaration)XmlParser.ParseBlock(node, null, parserInfo, true);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.AreEqual("a", input.OutputVariable);
            Assert.AreEqual(20, input.Amount);
        }
Exemple #9
0
        public void ParseWasteBlock()
        {
            JSProgram program = new JSProgram();

            program.AddWasteSegment("a", "z", 1249, false);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            parserInfo.AddVariable("", VariableType.FLUID, "a");
            parserInfo.AddVariable("", VariableType.WASTE, "z");
            Block input = XmlParser.ParseBlock(node, new DFG <Block>(), parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.IsTrue(input is WasteUsage);
        }
Exemple #10
0
        public void ParseMixerBlock()
        {
            JSProgram program = new JSProgram();

            program.AddMixerSegment("a", "b", 10, false, "c", 0, true);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            parserInfo.AddVariable("", VariableType.FLUID, "a");
            parserInfo.AddVariable("", VariableType.FLUID, "b");
            parserInfo.AddVariable("", VariableType.FLUID, "c");
            Mixer mixer = (Mixer)XmlParser.ParseBlock(node, null, parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.AreEqual("a", mixer.OutputVariable);
        }
Exemple #11
0
        public void ParseHeaterBlock()
        {
            JSProgram program = new JSProgram();

            program.AddHeaterSegment("a", "z", 173, 39, "b", 29, false);
            TestTools.ExecuteJS(program);

            XmlNode    node       = TestTools.GetWorkspace();
            ParserInfo parserInfo = new ParserInfo();

            parserInfo.EnterDFG();
            parserInfo.AddVariable("", VariableType.FLUID, "b");
            parserInfo.AddVariable("", VariableType.HEATER, "z");
            HeaterUsage heater = (HeaterUsage)XmlParser.ParseBlock(node, null, parserInfo);

            Assert.AreEqual(0, parserInfo.ParseExceptions.Count, parserInfo.ParseExceptions.FirstOrDefault()?.Message);
            Assert.AreEqual("a", heater.OutputVariable);
            Assert.AreEqual(173, heater.Temperature);
            Assert.AreEqual(39, heater.Time);
        }
Exemple #12
0
        static void Main(string[] args)
        {
            if (!Directory.Exists("unoptimizedPrograms"))
            {
                Directory.CreateDirectory("unoptimizedPrograms");
            }

            List <perf_data> unoptimizedDatas   = new List <perf_data>();
            List <perf_data> optimizedDatas     = new List <perf_data>();
            List <perf_data> optimizedNoGCDatas = new List <perf_data>();
            int       nameID = 0;
            Random    random = new Random(15231);
            TestTools tools  = new TestTools();

            for (int i = 0; i < 2000; i++)
            {
                try
                {
                    perf_data unoptimizedData   = new perf_data();
                    perf_data optimizedData     = new perf_data();
                    perf_data optimizedNoGCData = new perf_data();
                    JSProgram program           = new JSProgram();
                    program.Render = false;

                    tools.ClearWorkspace();
                    program.CreateCDFG(3, 15, random);
                    tools.ExecuteJS(program);

                    string xml    = tools.GetWorkspaceString();
                    var    result = XmlParser.Parse(xml);
                    if (result.Item2.Count > 0)
                    {
                        i--;
                        continue;
                    }

                    int     testCount = 5;
                    float[] untimes   = new float[testCount];
                    float[] optimes   = new float[testCount];

                    Stopwatch watch = new Stopwatch();
                    for (int z = 0; z < testCount; z++)
                    {
                        watch.Reset();
                        watch.Start();
                        TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                        ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                        programExecutor.TimeBetweenCommands     = 0;
                        programExecutor.EnableOptimizations     = false;
                        programExecutor.EnableGarbageCollection = false;
                        programExecutor.Run(100, 100, result.Item1, false);
                        unoptimizedData.makespan = commandExecutor.ticks;
                        watch.Stop();
                        untimes[z] = watch.ElapsedMilliseconds / (float)testCount;
                    }
                    {
                        int minSize = 10;
                        while (true)
                        {
                            try
                            {
                                result.Item1.Nodes.ForEach(x => x.dfg.Nodes.ForEach(qq => qq.value.Reset()));
                                TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                                ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                                programExecutor.TimeBetweenCommands     = 0;
                                programExecutor.EnableOptimizations     = false;
                                programExecutor.EnableGarbageCollection = false;
                                programExecutor.Run(minSize, minSize, result.Item1, false);
                                break;
                            }
                            catch (Exception e)
                            {
                                if (minSize > 100)
                                {
                                    Console.Write(e.Message + Environment.NewLine + e.StackTrace);
                                }
                                minSize++;
                            }
                        }
                        unoptimizedData.size = minSize;
                    }
                    for (int z = 0; z < testCount; z++)
                    {
                        watch.Reset();
                        watch.Start();
                        TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                        ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                        programExecutor.TimeBetweenCommands     = 0;
                        programExecutor.EnableOptimizations     = true;
                        programExecutor.EnableGarbageCollection = true;
                        programExecutor.Run(100, 100, result.Item1, false);
                        optimizedData.makespan = commandExecutor.ticks;
                        watch.Stop();
                        optimes[z] = watch.ElapsedMilliseconds / (float)testCount;
                    }
                    {
                        int minSize = 10;
                        while (true)
                        {
                            try
                            {
                                result.Item1.Nodes.ForEach(x => x.dfg.Nodes.ForEach(qq => qq.value.Reset()));
                                TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                                ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                                programExecutor.TimeBetweenCommands     = 0;
                                programExecutor.EnableOptimizations     = true;
                                programExecutor.EnableGarbageCollection = true;
                                programExecutor.Run(minSize, minSize, result.Item1, false);
                                break;
                            }
                            catch (Exception)
                            {
                                minSize++;
                            }
                        }
                        optimizedData.size = minSize;
                    }

                    {
                        TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                        ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                        programExecutor.TimeBetweenCommands     = 0;
                        programExecutor.EnableOptimizations     = true;
                        programExecutor.EnableGarbageCollection = false;
                        programExecutor.Run(100, 100, result.Item1, false);
                        optimizedNoGCData.makespan = commandExecutor.ticks;
                    }
                    {
                        int minSize = 10;
                        while (true)
                        {
                            try
                            {
                                result.Item1.Nodes.ForEach(x => x.dfg.Nodes.ForEach(qq => qq.value.Reset()));
                                TestCommandExecutor      commandExecutor = new TestCommandExecutor();
                                ProgramExecutor <string> programExecutor = new ProgramExecutor <string>(commandExecutor);
                                programExecutor.TimeBetweenCommands     = 0;
                                programExecutor.EnableOptimizations     = true;
                                programExecutor.EnableGarbageCollection = false;
                                programExecutor.Run(minSize, minSize, result.Item1, false);
                                break;
                            }
                            catch (Exception)
                            {
                                minSize++;
                            }
                        }
                        optimizedNoGCData.size = minSize;
                    }

                    unoptimizedData.time = untimes.Min();
                    optimizedData.time   = optimes.Min();

                    unoptimizedDatas.Add(unoptimizedData);
                    optimizedDatas.Add(optimizedData);
                    optimizedNoGCDatas.Add(optimizedNoGCData);

                    string path = Path.Combine("unoptimizedPrograms", $"program_{nameID++}.bc");
                    File.WriteAllText(path, xml);
                }
                catch (Exception e)
                {
                    //Console.Write(e.Message + Environment.NewLine + e.StackTrace);
                    i--;
                }

                Console.WriteLine(i);
            }
            tools.AssemblyCleanup();

            File.WriteAllText("unoptimized_data.txt", String.Join(Environment.NewLine, unoptimizedDatas.Select(x => x.makespan + " " + x.time.ToString(CultureInfo.InvariantCulture) + " " + x.size)));
            File.WriteAllText("optimized_data.txt", String.Join(Environment.NewLine, optimizedDatas.Select(x => x.makespan + " " + x.time.ToString(CultureInfo.InvariantCulture) + " " + x.size)));
            File.WriteAllText("optimized_no_gc_data.txt", String.Join(Environment.NewLine, optimizedNoGCDatas.Select(x => x.makespan + " " + x.size)));
        }