@@ -10,6 +10,8 @@ namespace MultiDF.VM
10
10
{
11
11
public class DefaultDocComparer : IDocComparer
12
12
{
13
+ private const float MAX_DIFF_THRESHOLD = 0.5f ;
14
+
13
15
public event Action < XMLDoc , XMLDoc > DocCompareStarted ;
14
16
public event QAComparedDelegate QACompared ;
15
17
public event Action QASkipped ;
@@ -18,9 +20,9 @@ public class DefaultDocComparer : IDocComparer
18
20
//This list will keep record of pairs of question that have been dispatched for comparison, so that
19
21
//we do not send them for comparison again. e.g. if X and Y have been dispatched for comparison, we will
20
22
//not dispatch the inverse pair Y and X.
21
- List < DFResultRow > DispatchedItems = new List < DFResultRow > ( ) ;
23
+ //HashSet<(QA, QA) > DispatchedItems;
22
24
23
- public Task < DFResult > Compare ( XMLDoc d1 , XMLDoc d2 , IQAComparer qaComparer , bool ignoreCase , CancellationToken token )
25
+ public DFResult Compare ( XMLDoc d1 , XMLDoc d2 , IQAComparer qaComparer , bool ignoreCase , CancellationToken token )
24
26
{
25
27
DFResult Result = new DFResult ( d1 , d2 , d1 . QAs . Count , d2 . QAs . Count ) ;
26
28
@@ -29,76 +31,69 @@ public Task<DFResult> Compare(XMLDoc d1, XMLDoc d2, IQAComparer qaComparer, bool
29
31
30
32
DocCompareStarted ? . Invoke ( d1 , d2 ) ;
31
33
32
- DispatchedItems . Clear ( ) ;
34
+ // DispatchedItems = new HashSet<(QA, QA)> ();
33
35
34
- return Task . Run ( ( ) =>
36
+ try
35
37
{
36
- Parallel . ForEach ( d1 . QAs , new ParallelOptions ( ) { CancellationToken = token } ,
37
- q1 =>
38
+ var AllComparisons = Parallel . ForEach ( d1 . QAs , new ParallelOptions ( ) { CancellationToken = token , MaxDegreeOfParallelism = 3 } ,
39
+ ( q1 ) =>
40
+ {
41
+
42
+ foreach ( var q2 in d2 . QAs )
43
+ {
44
+ Interlocked . Increment ( ref LoopCount ) ;
45
+ var Prog = 100 * ( LoopCount / TotalComparisons ) ;
46
+
47
+ if ( ! q1 . Equals ( q2 ) )
48
+ {
49
+ //var DFR = ProcessDFR(q1, q2, qaComparer, ignoreCase);
50
+
51
+ var DFR = new DFResultRow ( q1 , q2 , 0 ) ;
52
+ DFR . Distance = qaComparer . Distance ( q1 , q2 , ignoreCase ) ;
53
+
54
+
55
+ if ( DFR != null && DFR . Distance < MAX_DIFF_THRESHOLD )
38
56
{
39
- foreach ( var q2 in d2 . QAs )
40
- {
41
- var DFR = ProcessDFR ( q1 , q2 , qaComparer , ignoreCase , token ) ;
42
- Interlocked . Increment ( ref LoopCount ) ;
43
- var Prog = 100 * ( LoopCount / TotalComparisons ) ;
44
-
45
- if ( DFR != null )
46
- {
47
- lock ( this ) {
48
- Result . Items . Add ( DFR . Value ) ;
49
- QACompared ? . Invoke ( this , new QAComparedArgs ( ) { QA1 = q1 , QA2 = q2 , Distance = DFR . Value . Distance , PercentProgress = Prog } ) ;
50
- }
51
- }
52
- else
53
- QASkipped ? . Invoke ( ) ;
54
-
55
- token . ThrowIfCancellationRequested ( ) ;
56
- }
57
+ Result . Items . Add ( DFR ) ;
58
+ QACompared ? . Invoke ( this , new QAComparedArgs ( ) { QA1 = q1 , QA2 = q2 , Distance = DFR . Distance , PercentProgress = Prog } ) ;
57
59
}
58
- ) ;
59
- } ) . ContinueWith ( t =>
60
- {
61
- if ( t . Exception == null )
62
- {
63
- DocCompareCompleted ? . Invoke ( d1 , d2 ) ;
64
- return Result ;
65
- }
66
- else
67
- throw t . Exception ;
68
- } ) ;
69
- }
60
+ else
61
+ QASkipped ? . Invoke ( ) ;
70
62
63
+ token . ThrowIfCancellationRequested ( ) ;
64
+ }
65
+ }
71
66
72
- private DFResultRow ? ProcessDFR ( QA q1 , QA q2 , IQAComparer qaComparer , bool ignoreCase , CancellationToken token )
73
- {
74
- if ( q1 != q2 )
67
+ ViewModelLocator . Main . RaisePropertyChanged ( nameof ( MainVM . ElapsedTime ) ) ;
68
+ ViewModelLocator . Main . RaisePropertyChanged ( nameof ( MainVM . EstimatedRemainingTime ) ) ;
69
+ } ) ;
70
+ }
71
+ finally
75
72
{
76
- var DFR = new DFResultRow ( q1 , q2 , 0 ) ;
77
-
78
- var Flag = false ;
73
+ DocCompareCompleted ? . Invoke ( d1 , d2 ) ;
74
+ }
79
75
80
- lock ( DispatchedItems )
81
- {
82
- if ( ! DispatchedItems . Any ( i => i . Equals ( DFR ) ) )
83
- {
84
- DispatchedItems . Add ( DFR ) ;
85
- Flag = true ;
86
- }
87
- }
88
-
89
- if ( Flag )
90
- {
91
- if ( ! token . IsCancellationRequested )
92
- {
93
- DFR . Distance = qaComparer . Distance ( q1 , q2 , ignoreCase ) ;
76
+ return Result ;
77
+ }
94
78
95
- if ( ! token . IsCancellationRequested )
96
- return DFR ;
97
- }
98
- }
99
- }
79
+ private DFResultRow ? ProcessDFR ( QA q1 , QA q2 , IQAComparer qaComparer , bool ignoreCase )
80
+ {
81
+ //if (!DispatchedItems.Contains((q1, q2)))
82
+ //{
83
+ // lock (DispatchedItems)
84
+ // {
85
+ // DispatchedItems.Add((q1, q2));
86
+ // }
100
87
101
- return null ;
88
+ var DFR = new DFResultRow ( q1 , q2 , 0 ) ;
89
+ DFR . Distance = qaComparer . Distance ( q1 , q2 , ignoreCase ) ;
90
+ return DFR ;
91
+ //}
92
+ //else
93
+ //{
94
+ // System.Diagnostics.Debug.Print("Already dispatched");
95
+ // return null;
96
+ //}
102
97
}
103
98
}
104
99
}
0 commit comments