Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GrammaticalOptimization/DynamicDataDisplay/Common/Auxiliary/DataSearch/GenericSearcher1d.cs @ 12503

Last change on this file since 12503 was 12503, checked in by aballeit, 9 years ago

#2283 added GUI and charts; fixed MCTS

File size: 2.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace Microsoft.Research.DynamicDataDisplay.Common.DataSearch
7{
8  internal sealed class GenericSearcher1d<TCollection, TMember> where TMember : IComparable<TMember>
9  {
10    private readonly Func<TCollection, TMember> selector;
11    private readonly IList<TCollection> collection;
12    public GenericSearcher1d(IList<TCollection> collection, Func<TCollection, TMember> selector)
13    {
14      if (collection == null)
15        throw new ArgumentNullException("collection");
16      if (selector == null)
17        throw new ArgumentNullException("selector");
18
19      this.collection = collection;
20      this.selector = selector;
21    }
22
23    public SearchResult1d SearchBetween(TMember x)
24    {
25      return SearchBetween(x, SearchResult1d.Empty);
26    }
27
28    public SearchResult1d SearchBetween(TMember x, SearchResult1d result)
29    {
30      if (collection.Count == 0)
31        return SearchResult1d.Empty;
32
33      int lastIndex = collection.Count - 1;
34
35      if (x.CompareTo(selector(collection[0])) < 0)
36        return SearchResult1d.Empty;
37      else if (selector(collection[lastIndex]).CompareTo(x) < 0)
38        return SearchResult1d.Empty;
39
40      int startIndex = !result.IsEmpty ? Math.Min(result.Index, lastIndex) : 0;
41
42      // searching ascending
43      if (selector(collection[startIndex]).CompareTo(x) < 0)
44      {
45        for (int i = startIndex + 1; i <= lastIndex; i++)
46          if (selector(collection[i]).CompareTo(x) >= 0)
47            return new SearchResult1d { Index = i - 1 };
48      }
49      else // searching descending
50      {
51        for (int i = startIndex - 1; i >= 0; i--)
52          if (selector(collection[i]).CompareTo(x) <= 0)
53            return new SearchResult1d { Index = i };
54      }
55
56      throw new InvalidOperationException("Should not appear here.");
57    }
58
59    public SearchResult1d SearchFirstLess(TMember x)
60    {
61      if (collection.Count == 0)
62        return SearchResult1d.Empty;
63
64      SearchResult1d result = SearchResult1d.Empty;
65      for (int i = 0; i < collection.Count; i++)
66      {
67        if (selector(collection[i]).CompareTo(x) >= 0)
68        {
69          result.Index = i;
70          break;
71        }
72      }
73
74      return result;
75    }
76
77    public SearchResult1d SearchGreater(TMember x)
78    {
79      if (collection.Count == 0)
80        return SearchResult1d.Empty;
81
82      SearchResult1d result = SearchResult1d.Empty;
83      for (int i = collection.Count - 1; i >= 0; i--)
84      {
85        if (selector(collection[i]).CompareTo(x) <= 0)
86        {
87          result.Index = i;
88          break;
89        }
90      }
91
92      return result;
93    }
94  }
95}
Note: See TracBrowser for help on using the repository browser.