コード例 #1
0
ファイル: DataHandler.cs プロジェクト: d8xa/XRD-TAF
    public void SubmitToComputing()
    {
        const string method = nameof(SubmitToComputing);

        //FillInBlanks();    // TODO
        var startTime = DateTime.Now;
        var sw        = new Stopwatch();

        sw.Start();

        var logger = new Logger()
                     .SetPrintLevel(Logger.LogLevel.Custom)
                     .SetPrintFilter(new List <Logger.EventType> {
            Logger.EventType.Inspect, Logger.EventType.Warning
        });

        logger.Log(Logger.EventType.Info, $"{Scope(method)}: Logger initialized.");
        Compute(mainPanel.preset, logger, null, Settings.Flags.WriteFactors);
        if (Settings.flags.writeLogs)
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), Settings.DefaultValues.LogFolderName,
                                    $"{DateTime.Now:yyyy-MM-ddTHH.mm.ss} Log.txt");
            logger.WriteToFile(path);
        }
        logger.Log(Logger.EventType.Info, $"{Scope(method)}: Shader adapter executed.");

        sw.Stop();
        SetStatusMessage($"Last job executed at {startTime:T}.\nTime elapsed: {sw.Elapsed:g}.");
    }
コード例 #2
0
ファイル: ShaderAdapter.cs プロジェクト: d8xa/XRD-TAF
        protected ShaderAdapter(
            ComputeShader shader,
            Preset preset,
            bool writeFactors,
            Logger logger   = null,
            double[] angles = null,
            PerformanceReport performanceReport = null
            )
        {
            this.shader       = shader;
            properties        = preset.properties;
            metadata          = preset.metadata;
            this.writeFactors = writeFactors;
            if (logger != null)
            {
                SetLogger(logger);
            }
            if (performanceReport == null)
            {
                var info = PerformanceReport.InputInfo.FromPreset(preset);
                stopwatch = new PerformanceReport(info);
            }
            else
            {
                stopwatch = performanceReport;
            }
            if (angles != null)
            {
                this.angles = angles;
            }

            stopwatch.Start(PerformanceReport.TimeInterval.Category.Total);
            InitSharedFields();
        }
コード例 #3
0
 public PlaneModeAdapter(
     ComputeShader shader,
     Preset preset,
     bool writeFactors,
     Logger customLogger,
     PerformanceReport performanceReport
     ) : base(shader, preset, writeFactors, customLogger, null, performanceReport)
 {
     if (logger == null)
     {
         SetLogger(customLogger);
     }
     logger.Log(Logger.EventType.Class, $"{nameof(PlaneModeAdapter)} created.");
     InitializeOtherFields();
 }
コード例 #4
0
ファイル: IntegratedModeAdapter.cs プロジェクト: d8xa/XRD-TAF
 public IntegratedModeAdapter(
     ComputeShader shader,
     Preset preset,
     bool writeFactors,
     Logger customLogger,
     double[] angles,
     PerformanceReport performanceReport
     ) : base(shader, preset, writeFactors, customLogger, angles, performanceReport)
 {
     if (logger == null)
     {
         SetLogger(customLogger);
     }
     logger.Log(Logger.EventType.Class, $"{CLASS_NAME} created.");
     InitializeOtherFields();
 }
コード例 #5
0
ファイル: DataHandler.cs プロジェクト: d8xa/XRD-TAF
    public void Compute(Preset preset, Logger logger, PerformanceReport report, bool write = false,
                        double[] angles = null)
    {
        const string method = nameof(Compute);

        logger.Log(Logger.EventType.Info, $"{Scope(method)}: Shader adapter built." +
                   $" preset set to = {mainPanel.preset}");
        _shaderAdapter = _builder
                         .SetLogger(logger)
                         .SetWriteFactors(write)
                         .SetPerformanceReport(report)
                         .SetProperties(preset)
                         .SetAngles(angles)
                         .AutoSetShader()
                         .Build();
        _shaderAdapter.SetStatus(ref status);
        _shaderAdapter.Execute();
    }
コード例 #6
0
ファイル: DataHandler.cs プロジェクト: d8xa/XRD-TAF
    private void RunABTests()
    {
        const string method = nameof(RunABTests);

        Debug.Log($"{Scope(method)}: started.");

        var logger = new Logger()
                     .SetPrintFilter(new List <Logger.EventType> {
            Logger.EventType.Warning, Logger.EventType.Test
        })
                     .SetWriteFilter(new List <Logger.EventType> {
            Logger.EventType.Warning, Logger.EventType.Test
        });

        var logPath = Path.Combine(Directory.GetCurrentDirectory(), "Logs", "A-B Test log.txt");

        logger.Log(Logger.EventType.Info, $"{Scope(method)}: Logger initialized.");

        // read presets
        var testPresetNames = new List <string>
        {
            "ref",
            "ref ray"
        };
        var testPresets = testPresetNames
                          .Select(s => Path.Combine(_saveDir, s + Settings.DefaultValues.SerializedExtension))
                          .Select(ReadPreset)
                          .ToList();

        var modeList = new List <AbsorptionProperties.Mode>
        {
            AbsorptionProperties.Mode.Point,
            AbsorptionProperties.Mode.Area,
            AbsorptionProperties.Mode.Integrated
        };

        GenerateTestData(logger, testPresets, modeList);
        CompareTestData(logger, testPresets, modeList);

        SetStatusMessage("A/B-Test completed.");
        logger.AppendToFile(logPath);
    }
コード例 #7
0
ファイル: DataHandler.cs プロジェクト: d8xa/XRD-TAF
    private void GenerateTestData(Logger logger, List <Preset> presets, List <AbsorptionProperties.Mode> modes)
    {
        const string method = nameof(GenerateTestData);

        // Backup and modify flag.
        var clippingBackup = Settings.flags.clipAngles;

        Settings.flags.clipAngles = false;

        // generate and save test dataset.
        var step = 0;

        foreach (var mode in modes)
        {
            foreach (var preset in presets)
            {
                preset.properties.absorption.mode = mode;
                preset.metadata.pathOutputData    = "B";
                _shaderAdapter = _builder
                                 .SetLogger(logger)
                                 .SetWriteFactors(true)
                                 .SetProperties(preset)
                                 .AutoSetShader()
                                 .Build()
                ;
                _shaderAdapter.SetStatus(ref status);

                ++step;
                logger.Log(Logger.EventType.Test,
                           $"{Scope(method)}: " +
                           $"Shader adapter built. ({step}/{presets.Count*modes.Count})" +
                           $" preset set to = {preset.metadata.saveName}");
                _shaderAdapter.Execute();
                logger.Log(Logger.EventType.Test,
                           $"{Scope(method)}: Shader adapter executed. ({step}/{presets.Count * modes.Count})");
                _shaderAdapter.SetStatusMessage(
                    $"{Scope(method)}: Step {step}/6: preset {preset.metadata.saveName}, {mode}");
            }
        }

        Settings.flags.clipAngles = clippingBackup;
    }
コード例 #8
0
ファイル: Benchmark.cs プロジェクト: d8xa/XRD-TAF
        /// <summary>
        /// Run benchmark in DataHandler.
        /// </summary>
        /// <param name="write">Toggle to write the computation results to disk.</param>
        public Benchmark Run(bool write = true)
        {
            if (!Ready())
            {
                return(this);
            }

            var clipBackup = Settings.flags.clipAngles;

            Settings.flags.clipAngles = false;

            _reports = new List <PerformanceReport>();
            var logger = new Logger()
                         .SetPrintFilter(new List <Logger.EventType> {
                Logger.EventType.Warning, Logger.EventType.Performance
            })
                         .SetWriteFilter(new List <Logger.EventType> {
                Logger.EventType.Warning
            });

            foreach (var inputInfo in _inputInfos)
            {
                // set preset fields
                Adjust(inputInfo);
                var angles = MathTools.LinSpace1D(0.0, 180.0, inputInfo.n, false);

                var report = new PerformanceReport(inputInfo);
                _dataHandler.Compute(_preset, logger, report, write, angles);
                _reports.Add(_dataHandler.GetPerformanceReport());
                logger.Log(Logger.EventType.Performance, _dataHandler.GetPerformanceReport().ToString());
            }
            _done = true;
            Settings.flags.clipAngles = clipBackup;

            return(this);
        }
コード例 #9
0
ファイル: DataHandler.cs プロジェクト: d8xa/XRD-TAF
    private void CompareTestData(Logger logger, List <Preset> presets, List <AbsorptionProperties.Mode> modes)
    {
        // read datasets, compare B to A, generate report.
        foreach (var preset in presets)
        {
            var nrAngles = Parser.ImportAngles(Path.Combine(Directory.GetCurrentDirectory(),
                                                            Settings.DefaultValues.InputFolderName, preset.properties.angle.pathToAngleFile + ".txt")).Length;

            foreach (var mode in modes)
            {
                var folderBottom = preset.metadata.saveName ?? "";
                var outputDir    = Path.Combine(Directory.GetCurrentDirectory(),
                                                Settings.DefaultValues.OutputFolderName);
                var dirA = Path.Combine(outputDir, "A", folderBottom);
                var dirB = Path.Combine(outputDir, "B", folderBottom);

                List <Vector3> a;
                List <Vector3> b;

                preset.properties.absorption.mode = mode;
                preset.metadata.pathOutputData    = "A";
                var fileNameA = preset.properties.FilenameFormatter(nrAngles);
                preset.metadata.pathOutputData = "B";
                var fileNameB = preset.properties.FilenameFormatter(nrAngles);

                if (mode == AbsorptionProperties.Mode.Area)
                {
                    var a2D = Parser.ReadArray(Path.Combine(dirA, fileNameA), false, false, reverse: true);
                    var b2D = Parser.ReadArray(Path.Combine(dirB, fileNameB), false, false, reverse: true);

                    a = Enumerable.Range(0, a2D.GetLength(0))
                        .Select(i => Enumerable.Range(0, a2D.GetLength(1))
                                .Select(j => a2D[i, j]))
                        .SelectMany(v => v)
                        .ToList();
                    b = Enumerable.Range(0, b2D.GetLength(0))
                        .Select(i => Enumerable.Range(0, b2D.GetLength(1))
                                .Select(j => b2D[i, j]))
                        .SelectMany(v => v)
                        .ToList();
                }
                else
                {
                    a = Parser.ReadTableVector(Path.Combine(dirA, fileNameA), true, true).ToList();
                    b = Parser.ReadTableVector(Path.Combine(dirB, fileNameB), true, true).ToList();
                }

                Vector3 Subtract(Vector3 v1, Vector3 v2)
                {
                    return(new Vector3(
                               float.IsInfinity(v1.x) && float.IsInfinity(v2.x) ? 0f : v1.x - v2.x,
                               float.IsInfinity(v1.y) && float.IsInfinity(v2.y) ? 0f : v1.y - v2.y,
                               float.IsInfinity(v1.z) && float.IsInfinity(v2.z) ? 0f : v1.z - v2.z
                               ));
                }

                var diff = Enumerable.Range(0, a.Count)
                           .Select(i => Subtract(a[i], b[i]))
                           .ToList();
                var min = new Vector3(
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.x).Min(),
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.y).Min(),
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.z).Min()
                    );
                var max = new Vector3(
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.x).Max(),
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.y).Max(),
                    diff.AsParallel().Where(v => v != Vector3.positiveInfinity).Select(v => v.z).Max()
                    );
                var mean = diff.AsParallel()
                           .Where(v => v != Vector3.positiveInfinity)
                           .Aggregate((sum, v) => sum + v) /
                           diff.Count(v => v != Vector3.positiveInfinity);
                var var = diff.AsParallel()
                          .Where(v => v != Vector3.positiveInfinity)
                          .Select(v => v - mean)
                          .Select(v => Vector3.Scale(v, v))
                          .Aggregate((variance, v) => variance + v) /
                          diff.Count(v => v != Vector3.positiveInfinity);

                logger.Log(Logger.EventType.Test,
                           $"{Scope(nameof(CompareTestData))}: " +
                           $"Test result (preset=\"{preset.metadata.saveName}\", mode={mode}): " +
                           $"min={min:G}, max={max:G}, mean={mean:G}, var={var:G}"
                           );
            }
        }
    }
コード例 #10
0
ファイル: ShaderAdapter.cs プロジェクト: d8xa/XRD-TAF
 protected void SetLogger(Logger newLogger)
 {
     logger = newLogger;
 }