Beispiel #1
0
        private static ScriptCsArgs ReconcileArguments(ScriptCsArgs configArgs, ScriptCsArgs commandArgs, SplitResult splitResult)
        {
            if (configArgs == null)
                return commandArgs;

            if (commandArgs == null)
                return configArgs;

            foreach (var property in typeof(ScriptCsArgs).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var configValue = property.GetValue(configArgs);
                var commandValue = property.GetValue(commandArgs);
                var defaultValue = GetPropertyDefaultValue(property);

                if (!object.Equals(configValue, commandValue))
                {
                    if (!object.Equals(commandValue, defaultValue))
                    {
                        property.SetValue(configArgs, commandValue);
                    }
                    else
                    {
                        if (IsCommandLinePresent(splitResult.CommandArguments, property))
                            property.SetValue(configArgs, commandValue);
                    }
                }
            }

            return configArgs;
        }
Beispiel #2
0
        public static SplitResult SplitScriptArgs(string[] args)
        {
            Guard.AgainstNullArgument("args", args);

            var result = new SplitResult() { CommandArguments = args };

            // Split the arguments list on "--".
            // The arguments before the "--" (or all arguments if there is no "--") are
            // for ScriptCs.exe, and the arguments after that are for the csx script.
            int separatorLocation = Array.IndexOf(args, "--");
            int scriptArgsCount = separatorLocation == -1 ? 0 : args.Length - separatorLocation - 1;
            result.ScriptArguments = new string[scriptArgsCount];
            Array.Copy(args, separatorLocation + 1, result.ScriptArguments, 0, scriptArgsCount);

            if (separatorLocation != -1)
                result.CommandArguments = args.Take(separatorLocation).ToArray();

            return result;
        }
        public void RandomSplitSearcher_FindBestSplit()
        {
            var parser   = new CsvParser(() => new StringReader(Resources.AptitudeData));
            var feature  = parser.EnumerateRows("AptitudeTestScore").ToF64Vector();
            var targets  = parser.EnumerateRows("Pass").ToF64Vector();
            var interval = Interval1D.Create(0, feature.Length);

            Array.Sort(feature, targets);

            var impurityCalculator = new GiniClassificationImpurityCalculator();

            impurityCalculator.Init(targets.Distinct().ToArray(), targets, new double[0], interval);
            var impurity = impurityCalculator.NodeImpurity();

            var sut = new RandomSplitSearcher(1, 42);

            var actual = sut.FindBestSplit(impurityCalculator, feature, targets,
                                           interval, impurity);

            var expected = new SplitResult(15, 3.6724258636461693, 0.037941545633853213,
                                           0.39111111111111119, 0.49586776859504134);

            Assert.AreEqual(expected, actual);
        }
Beispiel #4
0
 public bool Equals(SplitResult other)
 {
     return(m_Head == other.m_Head && m_Rest == other.m_Rest);
 }
 internal Enumerator(SplitResult result)
 {
     _current = default;
     _state   = result._state; // copy by value
 }
Beispiel #6
0
        public List <SplitResult> LoadResults(Race race)
        {
            _currentRace = race;
            SplitResults = new List <SplitResult>();

            try
            {
                var athletes = _athleteRepository.GetAll(); //FindBy(x => x.Races.Any(y => y.Id == race.Id));
                var splits   = _splitRepository.FindBy(x => x.RaceId == race.Id && x.AthleteId > 0);

                foreach (var athlete in athletes)
                {
                    foreach (var split in splits.Where(x => x.AthleteId == athlete.Id && x.RaceId == race.Id))
                    {
                        var splitPosition  = splits.Where(x => x.SplitLapCount == split.SplitLapCount).OrderBy(x => x.DateTimeOfDay).ThenBy(x => x.RaceTime).ToList().FindIndex(x => x.AthleteId == athlete.Id) + 1;
                        var gendorPosition = splits.Where(x => x.SplitLapCount == split.SplitLapCount && x.Athlete.Gendor == athlete.Gendor).OrderBy(x => x.DateTimeOfDay).ThenBy(x => x.RaceTime).ToList().FindIndex(x => x.AthleteId == athlete.Id) + 1;
                        var ageCatPosition = splits.Where(x => x.SplitLapCount == split.SplitLapCount && x.Athlete.AgeCategory == athlete.AgeCategory).OrderBy(x => x.DateTimeOfDay).ThenBy(x => x.RaceTime).ToList().FindIndex(x => x.AthleteId == athlete.Id) + 1;

                        List <double> splitTimes = new List <double>();

                        foreach (var s in splits.Where(x => x.AthleteId == athlete.Id && x.RaceId == race.Id && x.SplitLapCount <= split.SplitLapCount))
                        {
                            splitTimes.Add(s.SplitTime);
                        }

                        double   doubleAverageTicks = splitTimes.Any() ? splitTimes.Average(timeSpan => timeSpan) : 0;
                        TimeSpan avgLap             = TimeSpan.FromMilliseconds(doubleAverageTicks);


                        var splitResult = new SplitResult
                        {
                            OveralPosition      = splitPosition,
                            GendorPosition      = gendorPosition,
                            AgeCategoryPosition = ageCatPosition,
                            AthleteName         = split.AthleteName,
                            AgeCategory         = split.Athlete.AgeCategory,
                            Bib       = split.Bib,
                            SplitTime = TimeSpan.FromMilliseconds(split.SplitTime).ToString("hh':'mm':'ss':'ff"),
                            TimeOfDay = split.TimeOfDay,
                            SplitName = split.SplitName,
                            RaceTime  = TimeSpan.FromTicks(split.RaceTime).ToString("hh':'mm':'ss':'ff"),
                            //   RaceTime2 = split.RaceTime2,
                            LapNumber = split.SplitLapCount,
                            Epc       = split.Epc,
                            RaceName  = split.Race.Name,
                            Rssi      = split.Rssi,
                            AverLap   = avgLap.ToString("hh':'mm':'ss':'ff"),
                            EstFinish = TimeSpan.FromSeconds(avgLap.Seconds * 25).ToString("hh':'mm':'ss':'ff"),
                        };

                        SplitResults.Add(splitResult);
                    }
                }
                SplitResults = SplitResults.OrderByDescending(x => x.LapNumber).ThenBy(x => x.OveralPosition).ToList();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Error loading results" + ex.Message);
            }

            return(SplitResults);
        }
 public bool Equals(SplitResult other)
 {
     return this.m_Head == other.m_Head && this.m_Rest == other.m_Rest;
 }
        /// <summary>
        /// 分页函数(模板)
        /// </summary>
        /// <param name="pageTotal">总记录数</param>
        /// <param name="pageSize">每页显示记录数</param>
        /// <param name="pageIndex">页面索引</param>
        /// <param name="pageShowLength">显示页码长度</param>
        /// <param name="pageName">页面名称</param>
        public SplitResult Split(int pageTotal, int pageSize, int pageIndex, int pageShowLength, string pageName, string pageParam = "")
        {
            //总页数
            var pageCount = 0;
            //下一页
            var nextIndex = 0;
            //上一页
            var preIndex = 0;
            //开始页码
            var startCount = 0;
            //结束页码
            var endCount = 0;
            // 将返回的结果
            var sr = new SplitResult();
            var sp = new StrPlus();

            if (pageIndex < 1) { pageIndex = 1; }

            //计算总页数
            if (pageSize != 0)
            {
                pageCount = (pageTotal / pageSize);
                pageCount = ((pageTotal % pageSize) != 0 ? pageCount + 1 : pageCount);
                pageCount = (pageCount == 0 ? 1 : pageCount);
            }
            nextIndex = pageIndex + 1;
            preIndex = pageIndex - 1;

            if (preIndex < 1) { preIndex = 1; }
            if (nextIndex > pageCount) { nextIndex = pageCount; }

            //中间页起始序号
            startCount = (pageIndex + pageShowLength / 2) > pageCount ? pageCount - (pageShowLength - 1) : pageIndex - pageShowLength / 2;

            //中间页终止序号
            endCount = pageIndex < pageShowLength / 2 ? pageShowLength : pageIndex + pageShowLength / 2;

            if (pageShowLength % 2 == 0) { startCount = startCount + 1; }


            //为了避免输出的时候产生负数,设置如果小于1就从序号1开始
            if (startCount < 1) { startCount = 1; }

            //页码+5的可能性就会产生最终输出序号大于总页码,那么就要将其控制在页码数之内
            if (pageCount < endCount) { endCount = pageCount; }

            // 首页
            sp += Template(Template_First, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex, pageName, pageParam);
            // 上一页
            sp += Template(Template_Pre, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex, pageName, pageParam);
            // 页码列表
            for (var i = startCount; i <= endCount; i++)
            {
                if (i != pageIndex || string.IsNullOrWhiteSpace(Template_Active)) { sp += Template(Template_Default, pageTotal, pageCount, nextIndex, preIndex, pageSize, i, pageName, pageParam); }
                else { sp += Template(Template_Active, pageTotal, pageCount, nextIndex, preIndex, pageSize, i, pageName, pageParam); }
            }
            // 下一页 
            sp += Template(Template_Next, pageTotal, pageCount, nextIndex, pageIndex, pageSize, pageIndex, pageName, pageParam);
            // 尾页
            sp += Template(Template_Last, pageTotal, pageCount, nextIndex, pageIndex, pageSize, pageIndex, pageName, pageParam);

            sr.Split = sp;
            sr.Record = Template(Template_Record, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex);

            return sr;
        }
Beispiel #9
0
 public bool Equals(SplitResult other)
 => Head == other.Head && Rest == other.Rest;
Beispiel #10
0
 public bool Equals(SplitResult other)
 {
     return(head == other.head && rest == other.rest);
 }
Beispiel #11
0
 public bool Equals(SplitResult other)
 {
     return(Head == other.Head && Rest == other.Rest);
 }
Beispiel #12
0
        /// <summary>
        /// 分页函数(模板)
        /// </summary>
        /// <param name="pageTotal">总记录数</param>
        /// <param name="pageSize">每页显示记录数</param>
        /// <param name="pageIndex">页面索引</param>
        /// <param name="pageName">页面名称</param>
        public SplitResult Split(int pageTotal, int pageSize, int pageIndex, string pageName, string pageParam = "")
        {
            //总页数
            var pageCount = 0;
            //下一页
            var nextIndex = 0;
            //上一页
            var preIndex = 0;
            //开始页码
            var startCount = 0;
            //结束页码
            var endCount = 0;
            // 将返回的结果
            var sr = new SplitResult();
            var sp = new StrPlus();

            if (pageIndex < 1)
            {
                pageIndex = 1;
            }

            //计算总页数
            if (pageSize != 0)
            {
                pageCount = (pageTotal / pageSize);
                pageCount = ((pageTotal % pageSize) != 0 ? pageCount + 1 : pageCount);
                pageCount = (pageCount == 0 ? 1 : pageCount);
            }
            nextIndex = pageIndex + 1;
            preIndex  = pageIndex - 1;

            if (preIndex < 1)
            {
                preIndex = 1;
            }
            if (nextIndex > pageCount)
            {
                nextIndex = pageCount;
            }

            //中间页起始序号
            startCount = (pageIndex + 5) > pageCount ? pageCount - 9 : pageIndex - 4;

            //中间页终止序号
            endCount = pageIndex < 5 ? 10 : pageIndex + 5;

            //为了避免输出的时候产生负数,设置如果小于1就从序号1开始
            if (startCount < 1)
            {
                startCount = 1;
            }

            //页码+5的可能性就会产生最终输出序号大于总页码,那么就要将其控制在页码数之内
            if (pageCount < endCount)
            {
                endCount = pageCount;
            }

            // 首页
            sp += Template(Template_First, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex, pageName, pageParam);
            // 上一页
            sp += Template(Template_Pre, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex, pageName, pageParam);
            // 页码列表
            for (var i = startCount; i <= endCount; i++)
            {
                if (i != pageIndex || Template_Active.IsNullOrEmpty())
                {
                    sp += Template(Template_Default, pageTotal, pageCount, nextIndex, preIndex, pageSize, i, pageName, pageParam);
                }
                else
                {
                    sp += Template(Template_Active, pageTotal, pageCount, nextIndex, preIndex, pageSize, i, pageName, pageParam);
                }
            }
            // 下一页
            sp += Template(Template_Next, pageTotal, pageCount, nextIndex, pageIndex, pageSize, pageIndex, pageName, pageParam);
            // 尾页
            sp += Template(Template_Last, pageTotal, pageCount, nextIndex, pageIndex, pageSize, pageIndex, pageName, pageParam);

            sr.Split  = sp;
            sr.Record = Template(Template_Record, pageTotal, pageCount, nextIndex, preIndex, pageSize, pageIndex);

            return(sr);
        }
Beispiel #13
0
        private static ScriptCsArgs ReconcileArguments(ScriptCsArgs globalConfigArgs, ScriptCsArgs localConfigArgs, ScriptCsArgs commandArgs, SplitResult splitResult)
        {
            if (globalConfigArgs == null && localConfigArgs == null)
            {
                return(commandArgs);
            }

            if (globalConfigArgs == null && commandArgs == null)
            {
                return(localConfigArgs);
            }

            if (localConfigArgs == null && commandArgs == null)
            {
                return(globalConfigArgs);
            }

            var reconciledArgs = new ScriptCsArgs();

            foreach (var property in typeof(ScriptCsArgs).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var defaultValue = GetPropertyDefaultValue(property);

                if (commandArgs != null)
                {
                    var commandValue = property.GetValue(commandArgs);
                    if (!Equals(commandValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, commandValue);
                        continue;
                    }
                    if (IsCommandLinePresent(splitResult.CommandArguments, property))
                    {
                        property.SetValue(reconciledArgs, commandValue);
                        continue;
                    }
                }

                if (localConfigArgs != null)
                {
                    var localConfigValue = property.GetValue(localConfigArgs);
                    if (!Equals(localConfigValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, localConfigValue);
                        continue;
                    }
                }

                if (globalConfigArgs != null)
                {
                    var globalConfigValue = property.GetValue(globalConfigArgs);
                    if (!Equals(globalConfigValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, globalConfigValue);
                    }
                }
            }

            return(reconciledArgs);
        }
        private static bool SplitOrdered(Range <T> lower, Range <T> higher,
                                         SplitResultRange lowerRangeName, SplitResultRange higherRangeName,
                                         out SplitResult before, out SplitResult intersection, out SplitResult after)
        {
            // 7 Possible results
            //   1) Disjoint             (a.h < b.l)   => (a.l to a.h) + (b.l to b.h)                            -- A_X_B
            //
            //   (a.l < b.l)
            //    2) Overlap             (a.h < b.h)   => (a.l to b.l - 1) + (b.l to a.l) + (a.l + 1 to b.h)     -- A_AB_B
            //    3) SuperSet            (a.h > b.h)   => (a.l to b.l - 1) + (b.l to b.h) + (b.h + 1 to a.h)     -- A_AB_A
            //    4) SuperSetToEnd       (a.h = b.h)   => (a.l to b.l - 1) + (b.l to b.h)                        -- A_AB_X
            //
            //   (a.l = b.l)
            //    5) SubSetFromStart     (a.h < b.h)   => (a.l to a.h)     + (a.h + 1 to b.h)                    -- X_AB_B
            //    6) SuperSetFromStart   (a.h > b.h)   => (a.l to b.h)     + (b.h + 1 to a.h)                    -- X_AB_A
            //    7) Union               (a.h = b.h)   => (a.l to b.h)                                           -- X_AB_X

            // [1] (a.h < b.l) | Disjoint => A_B
            if (lower.high.Precedes(higher.low))
            {
                before = new SplitResult(lower, lowerRangeName);

                intersection = SplitResult.Neither;

                after = new SplitResult(lower, higherRangeName);

                return(false);
            }
            else
            {
                // BEFORE -> [A|X] => when a.l != b.l, (a.l to b.l - 1)
                if (lower.low.Equals(higher.low))
                {
                    before = SplitResult.Neither;
                }
                else
                {
                    before = new SplitResult(lower.low, higher.low.Previous, lowerRangeName);
                }

                // INTERSECTION -> AB => (b.l to MIN(a.h, b.h))
                T ab_high = Min(lower.high, higher.high);

                intersection = new SplitResult(higher.low, ab_high, SplitResultRange.AB);

                // AFTER -> [A|B|X] => when a.h != b.h, (ab.h + 1 to MAX(a.h, b.h))
                if (lower.high.Follows(higher.high))
                {
                    after = new SplitResult(ab_high.Next, lower.high, lowerRangeName);
                }
                else if (higher.high.Follows(lower.high))
                {
                    after = new SplitResult(ab_high.Next, higher.high, higherRangeName);
                }
                else
                {
                    after = SplitResult.Neither;
                }

                return(true);
            }
        }
 public static bool SplitOrdered(Range <T> a, Range <T> b, out SplitResult before, out SplitResult intersection, out SplitResult after)
 {
     return(SplitOrdered(a, b, SplitResultRange.A, SplitResultRange.B, out before, out intersection, out after));
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="observations"></param>
        /// <param name="targets"></param>
        /// <param name="indices"></param>
        /// <param name="weights"></param>
        /// <returns></returns>
        public BinaryTree Build(F64MatrixView observations, double[] targets, int[] indices, double[] weights)
        {
            Array.Clear(m_variableImportance, 0, m_variableImportance.Length);

            Array.Resize(ref m_workTargets, indices.Length);
            Array.Resize(ref m_workFeature, indices.Length);
            Array.Resize(ref m_workIndices, indices.Length);

            var numberOfFeatures = observations.ColumnCount;

            if (m_featuresPrSplit == 0)
            {
                m_featuresPrSplit = numberOfFeatures;
            }

            Array.Resize(ref m_bestSplitWorkIndices, indices.Length);
            m_bestSplitWorkIndices.Clear();
            Array.Resize(ref m_variableImportance, numberOfFeatures);
            Array.Resize(ref m_allFeatureIndices, numberOfFeatures);
            Array.Resize(ref m_featureCandidates, m_featuresPrSplit);

            m_featuresCandidatesSet = false;

            for (int i = 0; i < m_allFeatureIndices.Length; i++)
            {
                m_allFeatureIndices[i] = i;
            }

            var allInterval = Interval1D.Create(0, indices.Length);

            indices.CopyTo(allInterval, m_workIndices);
            m_workIndices.IndexedCopy(targets, allInterval, m_workTargets);

            if (weights.Length != 0)
            {
                Array.Resize(ref m_workWeights, indices.Length);
                m_workIndices.IndexedCopy(weights, allInterval, m_workWeights);
            }

            var targetNames = targets.Distinct().ToArray();

            m_impurityCalculator.Init(targetNames, m_workTargets, m_workWeights, allInterval);
            var rootImpurity = m_impurityCalculator.NodeImpurity();

            var nodes         = new List <Node>();
            var probabilities = new List <double[]>();

            var stack = new Stack <DecisionNodeCreationItem>(100);

            stack.Push(new DecisionNodeCreationItem(0, NodePositionType.Root, allInterval, rootImpurity, 0));

            var first                       = true;
            var currentNodeIndex            = 0;
            var currentLeafProbabilityIndex = 0;

            while (stack.Count > 0)
            {
                var bestSplitResult  = SplitResult.Initial();
                var bestFeatureIndex = -1;
                var parentItem       = stack.Pop();

                var  parentInterval  = parentItem.Interval;
                var  parentNodeDepth = parentItem.NodeDepth;
                Node parentNode      = Node.Default();

                if (nodes.Count != 0)
                {
                    parentNode = nodes[parentItem.ParentIndex];
                }

                var parentNodePositionType = parentItem.NodeType;
                var parentImpurity         = parentItem.Impurity;

                if (first && parentNode.FeatureIndex != -1)
                {
                    nodes[0] = new Node(parentNode.FeatureIndex,
                                        parentNode.Value, -1, -1, parentNode.NodeIndex, parentNode.LeafProbabilityIndex);

                    first = false;
                }

                var isLeaf = (parentNodeDepth >= m_maximumTreeDepth);

                if (!isLeaf)
                {
                    SetNextFeatures(numberOfFeatures);

                    foreach (var featureIndex in m_featureCandidates)
                    {
                        m_workIndices.IndexedCopy(observations.ColumnView(featureIndex), parentInterval, m_workFeature);
                        m_workFeature.SortWith(parentInterval, m_workIndices);
                        m_workIndices.IndexedCopy(targets, parentInterval, m_workTargets);

                        if (weights.Length != 0)
                        {
                            m_workIndices.IndexedCopy(weights, parentInterval, m_workWeights);
                        }

                        var splitResult = m_splitSearcher.FindBestSplit(m_impurityCalculator, m_workFeature,
                                                                        m_workTargets, parentInterval, parentImpurity);

                        if (splitResult.ImpurityImprovement > bestSplitResult.ImpurityImprovement)
                        {
                            bestSplitResult = splitResult;
                            m_workIndices.CopyTo(parentInterval, m_bestSplitWorkIndices);
                            bestFeatureIndex = featureIndex;
                        }
                    }

                    isLeaf = isLeaf || (bestSplitResult.SplitIndex < 0);
                    isLeaf = isLeaf || (bestSplitResult.ImpurityImprovement < m_minimumInformationGain);

                    m_bestSplitWorkIndices.CopyTo(parentInterval, m_workIndices);
                }

                if (isLeaf)
                {
                    m_bestSplitWorkIndices.IndexedCopy(targets, parentInterval, m_workTargets);

                    if (weights.Length != 0)
                    {
                        m_bestSplitWorkIndices.IndexedCopy(weights, parentInterval, m_workWeights);
                    }

                    m_impurityCalculator.UpdateInterval(parentInterval);
                    var value = m_impurityCalculator.LeafValue();

                    var leaf = new Node(-1, value, -1, -1,
                                        currentNodeIndex++, currentLeafProbabilityIndex++);

                    probabilities.Add(m_impurityCalculator.LeafProbabilities());

                    nodes.Add(leaf);
                    nodes.UpdateParent(parentNode, leaf, parentNodePositionType);
                }
                else
                {
                    m_variableImportance[bestFeatureIndex] += bestSplitResult.ImpurityImprovement * parentInterval.Length / allInterval.Length;

                    var split = new Node(bestFeatureIndex, bestSplitResult.Threshold, -1, -1,
                                         currentNodeIndex++, -1);

                    nodes.Add(split);
                    nodes.UpdateParent(parentNode, split, parentNodePositionType);

                    var nodeDepth = parentNodeDepth + 1;

                    stack.Push(new DecisionNodeCreationItem(split.NodeIndex, NodePositionType.Right,
                                                            Interval1D.Create(bestSplitResult.SplitIndex, parentInterval.ToExclusive),
                                                            bestSplitResult.ImpurityRight, nodeDepth));

                    stack.Push(new DecisionNodeCreationItem(split.NodeIndex, NodePositionType.Left,
                                                            Interval1D.Create(parentInterval.FromInclusive, bestSplitResult.SplitIndex),
                                                            bestSplitResult.ImpurityLeft, nodeDepth));
                }
            }

            if (first) // No valid split return single leaf result
            {
                m_impurityCalculator.UpdateInterval(allInterval);

                var leaf = new Node(-1, m_impurityCalculator.LeafValue(), -1, -1,
                                    currentNodeIndex++, currentLeafProbabilityIndex++);

                probabilities.Add(m_impurityCalculator.LeafProbabilities());

                nodes.Clear();
                nodes.Add(leaf);
            }

            return(new BinaryTree(nodes, probabilities, targetNames,
                                  m_variableImportance.ToArray()));
        }
Beispiel #17
0
        private static ScriptCsArgs ReconcileArguments(ScriptCsArgs globalConfigArgs, ScriptCsArgs localConfigArgs, ScriptCsArgs commandArgs, SplitResult splitResult)
        {
            if (globalConfigArgs == null && localConfigArgs == null)
                return commandArgs;

            if (globalConfigArgs == null && commandArgs == null)
                return localConfigArgs;

            if (localConfigArgs == null && commandArgs == null)
                return globalConfigArgs;

            var reconciledArgs = new ScriptCsArgs();

            foreach (var property in typeof(ScriptCsArgs).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var defaultValue = GetPropertyDefaultValue(property);

                if (commandArgs != null)
                {
                    var commandValue = property.GetValue(commandArgs);
                    if (!Equals(commandValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, commandValue);
                        continue;
                    }
                    if (IsCommandLinePresent(splitResult.CommandArguments, property))
                    {
                        property.SetValue(reconciledArgs, commandValue);
                        continue;
                    }
                }

                if (localConfigArgs != null)
                {
                    var localConfigValue = property.GetValue(localConfigArgs);
                    if (!Equals(localConfigValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, localConfigValue);
                        continue;
                    }
                }

                if (globalConfigArgs != null)
                {
                    var globalConfigValue = property.GetValue(globalConfigArgs);
                    if (!Equals(globalConfigValue, defaultValue))
                    {
                        property.SetValue(reconciledArgs, globalConfigValue);
                    }
                }
            }

            return reconciledArgs;
        }
        private static ScriptCsArgs ReconcileArguments(ScriptCsArgs configArgs, ScriptCsArgs commandArgs, SplitResult splitResult)
        {
            if (configArgs == null)
            {
                return(commandArgs);
            }

            if (commandArgs == null)
            {
                return(configArgs);
            }

            foreach (var property in typeof(ScriptCsArgs).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var configValue  = property.GetValue(configArgs);
                var commandValue = property.GetValue(commandArgs);
                var defaultValue = GetPropertyDefaultValue(property);

                if (!object.Equals(configValue, commandValue))
                {
                    if (!object.Equals(commandValue, defaultValue))
                    {
                        property.SetValue(configArgs, commandValue);
                    }
                    else
                    {
                        if (IsCommandLinePresent(splitResult.CommandArguments, property))
                        {
                            property.SetValue(configArgs, commandValue);
                        }
                    }
                }
            }

            return(configArgs);
        }
 /// <summary>Initializes a new instance of the <see cref="T:System.Object" /> class.</summary>
 public RefTaggedResult(SplitResult splitResult, string tag)
 {
     SplitResult = splitResult;
     Tag         = tag;
 }