Example #1
0
        private void generateButton_Click(object sender, System.EventArgs e)
        {
            CancelRunningTask();
            var token = _tokenSource.Token;

            if (currentSize != (int)blockSizeBox.Value)
            {
                Task task = Task.Factory.StartNew(() =>
                {
                    blockSetGenerator = new IncrementalBlockSetGenerator((int)blockSizeBox.Value, token, new Random().Next());
                }, token).ContinueWith(_ => {
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }
                    currentSize  = (int)blockSizeBox.Value;
                    board.Blocks = blockSetGenerator.GenerateBlocks((int)blockCountBox.Value);

                    var bitmap = BitmapGenerator.DrawBlockList(board.Blocks);

                    pictureBox.ClientSize = new Size(bitmap.Width, bitmap.Height);
                    pictureBox.Image      = bitmap;
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
            else
            {
                board.Blocks = blockSetGenerator.GenerateBlocks((int)blockCountBox.Value);

                var bitmap = BitmapGenerator.DrawBlockList(board.Blocks);

                pictureBox.ClientSize = new Size(bitmap.Width, bitmap.Height);
                pictureBox.Image      = bitmap;
            }
        }
Example #2
0
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
            Console.WriteLine("Specify block size:");
            if (!int.TryParse(Console.ReadLine(), out int size))
            {
                return;
            }
            Console.WriteLine("Specify block count:");
            if (!int.TryParse(Console.ReadLine(), out int count))
            {
                return;
            }
            Console.WriteLine("Specify tests count >= 3:");
            if (!int.TryParse(Console.ReadLine(), out int testCount))
            {
                return;
            }
            Console.WriteLine("Specify result path:");
            var path = Console.ReadLine();

            testCount = Math.Max(testCount, 3);
            var testMethods = new List <Function>
            {
                Function.Square, Function.FastSquare, Function.Rectangle, Function.FastRectangle
            };

            using var w = new StreamWriter(path);
            WriteHeaders(w, testMethods);
            for (int s = 1; s <= size; s++)
            {
                Console.WriteLine($"Starting tests for block size {s}");
                IncrementalBlockSetGenerator blockSetGenerator =
                    new IncrementalBlockSetGenerator(size, CancellationToken.None);
                for (int bc = 1; bc <= count; bc++)
                {
                    var tests = ConductTest(blockSetGenerator, s, bc, testCount,
                                            testMethods);

                    foreach (var test in tests)
                    {
                        WriteTest(w, test.blockSize, test.blockCount, test.results);
                    }
                    var analyzed = AnalyseTests(tests, testMethods);
                    w.WriteLine("Means:");
                    w.Flush();
                    WriteTest(w, s, bc, analyzed);

                    w.WriteLine("");
                    w.Flush();
                }
            }
        }
Example #3
0
        private void fromFileButton_Click(object sender, System.EventArgs e)
        {
            CancelRunningTask();
            var token = _tokenSource.Token;

            if (currentSize != (int)blockSizeBox.Value)
            {
                blockSetGenerator = new IncrementalBlockSetGenerator((int)blockSizeBox.Value, token, new Random().Next());
                currentSize       = (int)blockSizeBox.Value;
            }

            OpenFileDialog openFileDialog = new OpenFileDialog();
            DialogResult   result         = openFileDialog.ShowDialog(); // Show the dialog.

            if (result != DialogResult.OK)
            {
                return;
            }
            string file = openFileDialog.FileName;

            try
            {
                var lines = File.ReadAllLines(file);
                for (int i = 0; i < lines.Length;)
                {
                    List <Block> blocks = new List <Block>();
                    if (!int.TryParse(lines[i], out int size))
                    {
                        return;
                    }
                    string alg     = lines[i + 1];
                    string input   = lines[i + 2];
                    var    numbers = input.Split(' ');
                    if (numbers.Length == 1)
                    {
                        if (!int.TryParse(input, out int count))
                        {
                            return;
                        }
                        blocks = new IncrementalBlockSetGenerator(size, token, new Random().Next()).GenerateBlocks(count);
                    }
                    else
                    {
                        switch (size)
                        {
                        case 5:
                            for (var index = 0; index < numbers.Length; index++)
                            {
                                var num = numbers[index];
                                if (!int.TryParse(num, out int count))
                                {
                                    return;
                                }
                                for (int j = 0; j < count; j++)
                                {
                                    blocks.Add(new PredefinedBlockSet(5).Get(index));
                                }
                            }
                            break;

                        case 6:
                            for (var index = 0; index < numbers.Length; index++)
                            {
                                var num = numbers[index];
                                if (!int.TryParse(num, out int count))
                                {
                                    return;
                                }
                                for (int j = 0; j < count; j++)
                                {
                                    blocks.Add(new PredefinedBlockSet(6).Get(index));
                                }
                            }
                            break;

                        default:
                            return;
                        }
                    }
                    board.Blocks = blocks;
                    break;
                }

                var bitmap = BitmapGenerator.DrawBlockList(board.Blocks);

                pictureBox.ClientSize = new Size(bitmap.Width, bitmap.Height);
                pictureBox.Image      = bitmap;
            }
            catch (IOException) { }
        }
Example #4
0
        static int Main(string[] args)
        {
            if (args.Length == 0)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
            else
            {
                var lines = File.ReadAllLines(args[0]);
                for (int i = 0; i < lines.Length; i += 3)
                {
                    List <Block> blocks = new List <Block>();
                    if (!int.TryParse(lines[i], out int size))
                    {
                        return(1);
                    }
                    string alg     = lines[i + 1];
                    string input   = lines[i + 2];
                    var    numbers = input.Split(' ');
                    if (numbers.Length == 1)
                    {
                        if (!int.TryParse(input, out int count))
                        {
                            return(1);
                        }
                        blocks = new IncrementalBlockSetGenerator(size, CancellationToken.None, new Random().Next()).GenerateBlocks(count);
                    }
                    else
                    {
                        switch (size)
                        {
                        case 5:
                            for (var index = 0; index < numbers.Length; index++)
                            {
                                var num = numbers[index];
                                if (!int.TryParse(num, out int count))
                                {
                                    return(1);
                                }
                                for (int j = 0; j < count; j++)
                                {
                                    blocks.Add(new PredefinedBlockSet(5).Get(index));
                                }
                            }
                            break;

                        case 6:
                            for (var index = 0; index < numbers.Length; index++)
                            {
                                var num = numbers[index];
                                if (!int.TryParse(num, out int count))
                                {
                                    return(1);
                                }
                                for (int j = 0; j < count; j++)
                                {
                                    blocks.Add(new PredefinedBlockSet(6).Get(index));
                                }
                            }
                            break;

                        default:
                            return(1);
                        }
                    }
                    Board board = new Board();
                    board.Blocks = blocks;
                    Stopwatch sw = new Stopwatch();
                    switch (alg)
                    {
                    case "ok":
                    {
                        Console.WriteLine("Running optimal square algorithm:");
                        sw.Start();
                        var result = board.Square();
                        sw.Stop();
                        CLISolutionPrinter.PrintSolution(result);
                        Console.WriteLine($"Found square size: {result.GetLength(0)}x{result.GetLength(0)}, time: {sw.ElapsedMilliseconds} ms\n");
                        break;
                    }

                    case "hk":
                    {
                        Console.WriteLine("Running heuristic square algorithm:");
                        sw.Start();
                        var result = board.FastSquare();
                        sw.Stop();
                        CLISolutionPrinter.PrintSolution(result);
                        Console.WriteLine($"Found square size: {result.GetLength(0)}x{result.GetLength(0)}, time: {sw.ElapsedMilliseconds} ms\n");
                        break;
                    }

                    case "op":
                    {
                        Console.WriteLine("Running optimal rectangle algorithm:");
                        sw.Start();
                        var result = board.Rectangle();
                        sw.Stop();
                        CLISolutionPrinter.PrintSolution(result.Item1);
                        Console.WriteLine($"Found rectangle, cuts: {result.Item2}, time: {sw.ElapsedMilliseconds} ms");
                        break;
                    }

                    case "hp":
                    {
                        Console.WriteLine("Running heuristic rectangle algorithm:");
                        sw.Start();
                        var result = board.FastRectangle();
                        sw.Stop();
                        CLISolutionPrinter.PrintSolution(result.Item1);
                        Console.WriteLine($"Found rectangle, cuts: {result.Item2}, time: {sw.ElapsedMilliseconds} ms\n");
                        break;
                    }

                    default:
                        return(1);
                    }
                }
            }

            return(0);
        }