Ejemplo n.º 1
0
        internal static bool Represents(ObsFilter a, GroupInfo b)
        {
            if (a == null || a.Conditions.Count != 1)
            {
                return(false);
            }

            var x = a.Conditions[0] as ObsFilter.ConditionGroup;

            if (x == null ||
                x.Negate ||
                x.Operator != Filter.EElementOperator.Is ||
                x.Possibilities.Count != 1 ||
                x.CombiningOperator != Filter.ELogicOperator.And)
            {
                return(false);
            }

            if (x.Possibilities[0] != b)
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Adds and a single new observation filter.
        /// </summary>
        internal void AddObsFilter(ObsFilter toAdd)
        {
            List <ObsFilter> existing = new List <ObsFilter>(this.ObsFilters);

            existing.Add(toAdd);
            this.SetObsFilters(existing.ToArray());
        }
Ejemplo n.º 3
0
        public readonly Peak VectorBPeak;                           // Which peak the second input vector comes from (only used if [VectorBSource] is AltPeak)

        public ArgsStatistic(string id, IMatrixProvider source, ObsFilter atypes, EAlgoInputBSource bsrc, ObsFilter btypes, Peak compareTo, object[] parameters)
            : base(id, source, parameters)
        {
            this.VectorAConstraint = atypes;
            this.VectorBConstraint = btypes;
            this.VectorBSource     = bsrc;
            this.VectorBPeak       = compareTo;
        }
Ejemplo n.º 4
0
        public readonly ObsFilter Constraint;       // (ONLY FOR TREND-BASED CORRECTIONS) Constraint on the input vector

        public ArgsCorrection(string id, IMatrixProvider source, object[] parameters, ECorrectionMode mode, ECorrectionMethod method, GroupInfo controlGroup, ObsFilter constraint)
            : base(id, source, parameters)
        {
            Mode         = mode;
            Method       = method;
            ControlGroup = controlGroup;
            Constraint   = constraint;
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Constructor.
 /// </summary>
 public ArgsClusterer(string id, IMatrixProvider source, PeakFilter sigFilter, ConfigurationMetric distance, ObsFilter atypes, bool splitGroups, EClustererStatistics suppressMetric, object[] parameters, string clusterNamePrefix)
     : base(id, source, parameters)
 {
     this.PeakFilter        = sigFilter;
     this.Distance          = distance;
     this.ObsFilter         = atypes;
     this.SplitGroups       = splitGroups;
     this.Statistics        = suppressMetric;
     this.OverrideShortName = clusterNamePrefix;
 }
Ejemplo n.º 6
0
 private static string CreatePartialKey(ObsFilter obsFilter, string key)
 {
     if (obsFilter != null)
     {
         return("Partial vector (" + obsFilter.ToString() + ")\\" + key);
     }
     else
     {
         return("Full vector\\" + key);
     }
 }
Ejemplo n.º 7
0
        private void AllGroupsFilters(Core core, List <ObsFilter> results)
        {
            foreach (GroupInfo group in core.Groups)
            {
                if (!results.Any(z => Represents(z, group)))
                {
                    ObsFilter.Condition cond  = new ObsFilter.ConditionGroup(Filter.ELogicOperator.And, false, Filter.EElementOperator.Is, new GroupInfo[] { group });
                    ObsFilter           toAdd = new ObsFilter(null, null, new[] { cond });

                    results.Add(toAdd);
                }
            }
        }
Ejemplo n.º 8
0
        void setFilter_Click(object sender, EventArgs e)
        {
            object tag = (((ToolStripMenuItem)sender).Tag);

            if (tag is ObsFilter)
            {
                this._obsFilter = (ObsFilter)tag;
            }
            else
            {
                this._peakFilter = (PeakFilter)tag;
            }

            this.UpdateScores();
        }
Ejemplo n.º 9
0
        private FrmPca(Core core, FrmMain frmMain)
        {
            this.InitializeComponent();
            UiControls.SetIcon(this);
            UiControls.ColourMenuButtons(this.toolStrip1);

            this._frmMain = frmMain;
            this._core    = core;

            this._peakFilter = PeakFilter.Empty;
            this._obsFilter  = ObsFilter.Empty;

            this._selectedCorrection = core.Options.SelectedMatrixProvider;

            this._colourBy._colourByPeak             = ColumnManager.GetColumns <Peak>(this._core).First(z => z.Id == Peak.ID_COLUMN_CLUSTERCOMBINATION);
            this._colourBy._colourByObervation       = ColumnManager.GetColumns <ObservationInfo>(this._core).First(z => z.Id == nameof(ObservationInfo.Group));
            this._regressAgainst._colourByPeak       = this._colourBy._colourByPeak;
            this._regressAgainst._colourByObervation = this._colourBy._colourByObervation;

            this._chart.AddControls(this.toolStripDropDownButton1);
            this._chart.Style.LegendDisplay = ELegendDisplay.Visible;

            this.UpdateScores();
        }
Ejemplo n.º 10
0
 /// <summary>
 /// All the filters for a particular observation filter
 /// </summary>
 public static DataSet <ObsFilter.Condition> ForObsFilterConditions(Core core, ObsFilter of)
 {
     return(new DataSet <ObsFilter.Condition>()
     {
         Core = core,
         ListTitle = "Observation filter conditions",
         ListSource = of != null?of.Conditions.Cast <ObsFilter.Condition>() : new ObsFilter.Condition[0],
                          HandleEdit = z => FrmEditObsFilterCondition.Show(z.Owner, core, z.DefaultValue, z.ReadOnly),
                          ListSupportsReorder = true,
                          Icon = Resources.ListIconFilter,
     });
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Determines what needs calculating.
        /// </summary>
        private void Thread_AddFilterToCalculationList([Const] Core core, [Const] ConfigurationMetric metric, [Const] IntensityMatrix vmatrix, [Const] DistanceMatrix dmatrix, [Const] EClustererStatistics statistics, [Const] Cluster[] realClusters, [Const] ObsFilter obsFilter, [MutableUnsafe] List <ForStat> needsCalculating, [MutableSafe] ProgressParallelHandler progP)
        {
            progP.SafeIncrement();

            IntensityMatrix vmatFiltered;
            DistanceMatrix  dmatFiltered;

            int[] filteredIndices;

            if (obsFilter == null)
            {
                vmatFiltered    = vmatrix;
                dmatFiltered    = dmatrix;
                filteredIndices = null;
            }
            else
            {
                filteredIndices = vmatrix.Columns.Which(z => obsFilter.Test(z.Observation)).ToArray();  // TODO: Multuple iteration
                vmatFiltered    = vmatrix.Subset(null, obsFilter, ESubsetFlags.None);
                dmatFiltered    = null;
            }

            Dictionary <Cluster, IReadOnlyList <double> > centreVectors = new Dictionary <Cluster, IReadOnlyList <double> >();

            foreach (Cluster cluster in realClusters)
            {
                /////////////////////
                // ASSIGNMENT STATS
                var centre = cluster.GetCentre(ECentreMode.Average, ECandidateMode.Assignments);
                IReadOnlyList <double> centreVector = centre.Count != 0 ? centre[0] : null;

                if (filteredIndices != null)
                {
                    centreVector = centreVector.Extract(filteredIndices);
                }

                centreVectors.Add(cluster, centreVector);
            }

            foreach (Assignment ass in Assignments)
            {
                ForStat f = new ForStat();
                f.Assignment = ass;
                f.ObsFilter  = obsFilter;

                if (filteredIndices != null)
                {
                    f.AssignmentVector = vmatFiltered.Vectors[ass.Vector.Index];
                }
                else
                {
                    f.AssignmentVector = ass.Vector;
                }

                f.ClusterVector = centreVectors[ass.Cluster];

                if (statistics.HasFlag(EClustererStatistics.SilhouetteWidth))
                {
                    if (dmatFiltered == null)
                    {
                        dmatFiltered = DistanceMatrix.Create(core, vmatrix, metric, ProgressReporter.GetEmpty());
                    }
                }

                f.DistanceMatrix = dmatFiltered;

                lock (needsCalculating)
                {
                    needsCalculating.Add(f);
                }
            }
        }
Ejemplo n.º 12
0
        private void _btnMarkAsOutlier_Click(object sender, EventArgs e)
        {
            object          item            = this._chart.SelectedItem.DataPoint.Tag;
            ObservationInfo observationInfo = item as ObservationInfo;
            Peak            peak            = item as Peak;

            bool safeToReplace = false;

            if (peak != null)
            {
                List <PeakFilter.Condition> filters = new List <PeakFilter.Condition>(this._peakFilter.Conditions.Cast <PeakFilter.Condition>());
                bool needsNewFilter = true;

                foreach (PeakFilter.Condition filter in filters)
                {
                    PeakFilter.ConditionPeak klalkq = filter as PeakFilter.ConditionPeak;

                    if (klalkq != null &&
                        klalkq.CombiningOperator == Filter.ELogicOperator.And &&
                        klalkq.Negate == false &&
                        klalkq.PeaksOp == Filter.EElementOperator.IsNot)
                    {
                        needsNewFilter = false;

                        List <Peak> strong;

                        if (!klalkq.Peaks.TryGetStrong(out strong))
                        {
                            FrmMsgBox.ShowError(this, "Couldn't modify current filter because it contains expired data.");
                            return;
                        }

                        filters.Remove(klalkq);
                        filters.Add(new PeakFilter.ConditionPeak(Filter.ELogicOperator.And, false, strong.ConcatSingle(peak), Filter.EElementOperator.IsNot));
                        safeToReplace = filters.Count == 1;
                        break;
                    }
                }

                if (needsNewFilter)
                {
                    filters.Add(new PeakFilter.ConditionPeak(Filter.ELogicOperator.And, false, new[] { peak }, Filter.EElementOperator.IsNot));
                }

                PeakFilter newFilter = new PeakFilter(null, null, filters);

                if (safeToReplace)
                {
                    this._core.SetPeakFilters(this._core.PeakFilters.ReplaceSingle(this._peakFilter, newFilter).ToArray());
                }
                else
                {
                    this._core.SetPeakFilters(this._core.PeakFilters.ConcatSingle(newFilter).ToArray());
                }

                this._peakFilter = newFilter;

                this.UpdateScores();
                return;
            }

            if (observationInfo == null)
            {
                bool needsNewFilter2 = true;

                List <ObsFilter.Condition> filters2 = new List <ObsFilter.Condition>(this._obsFilter.Conditions.Cast <ObsFilter.Condition>());

                foreach (ObsFilter.ConditionObservation fikaklq in filters2)
                {
                    ObsFilter.ConditionObservation qkklqq = fikaklq as ObsFilter.ConditionObservation;

                    if (qkklqq != null &&
                        qkklqq.CombiningOperator == Filter.ELogicOperator.And &&
                        qkklqq.Negate == false &&
                        qkklqq.Operator == Filter.EElementOperator.IsNot)
                    {
                        needsNewFilter2 = false;

                        filters2.Remove(qkklqq);
                        filters2.Add(new ObsFilter.ConditionObservation(Filter.ELogicOperator.And, false, Filter.EElementOperator.IsNot, qkklqq.Possibilities.ConcatSingle(observationInfo)));
                        safeToReplace = filters2.Count == 1;
                        break;
                    }
                }

                if (needsNewFilter2)
                {
                    filters2.Add(new ObsFilter.ConditionObservation(Filter.ELogicOperator.And, false, Filter.EElementOperator.IsNot, new[] { observationInfo }));
                }

                ObsFilter obsFilter = new ObsFilter(null, null, filters2);

                if (safeToReplace)
                {
                    this._core.SetObsFilters(this._core.ObsFilters.ReplaceSingle(this._obsFilter, obsFilter).ToArray());
                }
                else
                {
                    this._core.SetObsFilters(this._core.ObsFilters.ConcatSingle(obsFilter).ToArray());
                }

                this._obsFilter = obsFilter;

                this.UpdateScores();
            }
        }
        void wizard_OkClicked(object sender, EventArgs e)
        {
            // Check
            if (!this._wizard.RevalidateAll())
            {
                FrmMsgBox.ShowError(this, "Not all options have been selected.");
                return;
            }

            int    param1_numClusters   = this._radStopN.Checked ? int.Parse(this._txtStopN.Text) : int.MinValue;
            double param2_distanceLimit = this._radStopD.Checked ? double.Parse(this._txtStopD.Text) : double.MinValue;

            Debug.Assert(this._ecbSeedPeak.HasSelection, "Expected a seed peak to be selected");
            WeakReference <Peak> param3_seedPeak  = new WeakReference <Peak>(this._ecbSeedPeak.SelectedItem);
            GroupInfo            param4_seedGroup = NamedItem <GroupInfo> .Extract(this._lstGroups.SelectedItem);

            int             param5_doKMeans = this._radFinishK.Checked ? 1 : 0;
            IMatrixProvider source          = this._ecbSource.SelectedItem;

            object[] parameters = { param1_numClusters, param2_distanceLimit, param3_seedPeak, param4_seedGroup, param5_doKMeans };
            string   name       = "DK";

            // Create a constraint that only allows overlapping timepoints
            HashSet <int>       overlappingPoints = new HashSet <int>();
            var                 fil           = this._ecbFilter.SelectedItem ?? ObsFilter.Empty;
            var                 passed        = fil.Test(source.Provide.Columns.Select(z => z.Observation)).Passed;
            HashSet <GroupInfo> groups        = new HashSet <GroupInfo>(passed.Select(z => z.Group));
            bool                needsExFilter = false;

            foreach (int ctp in this._core.Times)
            {
                bool trueInAny  = false;
                bool falseInAny = false;

                foreach (GroupInfo g in groups)
                {
                    if (passed.Any(z => z.Group == g && z.Time == ctp))
                    {
                        trueInAny = true;
                    }
                    else
                    {
                        falseInAny = true;
                    }
                }

                if (trueInAny && !falseInAny) // i.e. true in all          TT
                {
                    overlappingPoints.Add(ctp);
                }
                else if (trueInAny) // i.e. true in one but not all        TF
                {
                    needsExFilter = true;
                }
                //else if (falseInAny) //  False in all (accptable)        FT
                // else       //     No groups                             FF
            }

            ObsFilter trueFilter;

            if (needsExFilter)
            {
                List <ObsFilter.Condition> conditions = new List <ObsFilter.Condition>
                {
                    new ObsFilter.ConditionFilter(Filter.ELogicOperator.And, false,
                                                  this._ecbFilter.SelectedItem, true),
                    new ObsFilter.ConditionTime(Filter.ELogicOperator.And, false,
                                                Filter.EElementOperator.Is,
                                                overlappingPoints)
                };


                trueFilter = new ObsFilter(null, null, conditions);
                this._core.AddObsFilter(trueFilter);
            }
            else
            {
                trueFilter = this._ecbFilter.SelectedItem;
            }

            ArgsClusterer args = new ArgsClusterer(
                Algo.ID_DKMEANSPPWIZ,
                this._ecbSource.SelectedItem,
                this._ecbPeakFilter.SelectedItem,
                new ConfigurationMetric()
            {
                Args = new ArgsMetric(this._ecbDistance.SelectedItem.Id, this._ecbSource.SelectedItem, this._ecbDistance.SelectedItem.Parameters.StringToParams(this._core, this._txtDistanceParams.Text))
            },
                trueFilter,
                this._chkClusterIndividually.Checked,
                EClustererStatistics.None,
                parameters,
                "DK")
            {
                OverrideDisplayName = name,
                Comment             = "Generated using wizard"
            };

            ConfigurationClusterer config = new ConfigurationClusterer()
            {
                Args = args
            };

            FrmWait.Show(this, "Clustering", null, z => this._core.AddClusterer(config, z));
            this.DialogResult = DialogResult.OK;
        }