using System;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using miew.Concurrency;
using miew.Debugging;
using miew.Tokenization;
using miew.Enumerable;
#pragma warning disable 0649
namespace agree
{
public sealed partial class ParseControl : ISysObj, IDisposable
{
public class Stats
{
public enum Visibility { Public = 0, Private };
ParseControl ctrl;
public Stats(ParseControl ctrl)
{
this.ctrl = ctrl;
this.Morphology = new _morphology(this);
this.Parsing = new _parsing(this);
this.Totals = new _totals(this);
}
public void Disconnect()
{
/// don't hold on to the chart or parse control structure just on account of someone retaining these stats
ctrl.chart = null;
ctrl = null;
}
public _morphology Morphology;
public _parsing Parsing;
public _totals Totals;
public _system_info SystemInfo;
public struct _unification
{
Visibility vis;
public _unification(Visibility vis)
{
this.vis = vis;
this.c_attempted = 0;
this.c_succeeded = 0;
}
public int c_attempted;
public int c_succeeded;
public void AddAttempts(int c)
{
if (vis == Visibility.Public)
Interlocked.Add(ref c_attempted, c);
else
c_attempted += c;
}
public void AddSuccesses(int c)
{
if (vis == Visibility.Public)
Interlocked.Add(ref c_succeeded, c);
else
c_succeeded += c;
}
public double SuccessRatio { get { return c_succeeded / (double)c_attempted; } }
public void Add(_unification other)
{
if (vis == Visibility.Public)
{
Interlocked.Add(ref c_attempted, other.c_attempted);
Interlocked.Add(ref c_succeeded, other.c_succeeded);
}
else
{
c_attempted += other.c_attempted;
c_succeeded += other.c_succeeded;
}
}
public void RecordEvent(Object o)
{
if (vis == Visibility.Public)
{
Interlocked.Increment(ref c_attempted);
if (o != null)
Interlocked.Increment(ref c_succeeded);
}
else
{
c_attempted++;
if (o != null)
c_succeeded++;
}
}
public void RecordEvent(bool b)
{
if (vis == Visibility.Public)
{
Interlocked.Increment(ref c_attempted);
if (b)
Interlocked.Increment(ref c_succeeded);
}
else
{
c_attempted++;
if (b)
c_succeeded++;
}
}
};
public struct _morphology
{
Stats s;
public _morphology(Stats s)
: this()
{
this.s = s;
}
public _unification Unification;
public int c_lexical_transforms;
public int c_analysis_stacks;
public long ms_time;
public double TimeRatio { get { return (double)ms_time / s.Totals.ms_time; } }
public void SetComplete() { ms_time = s.ctrl.timer.ElapsedMilliseconds; }
};
public struct _parsing
{
Stats s;
public _parsing(Stats s)
{
this.s = s;
this.Chart = new _chart(s);
this.Unification = default(_unification);
this.Packing = default(_packing);
this.Unpacking = new _unpacking(s);
this.QuickCheck = default(_quick_check);
}
public _chart Chart;
public _unification Unification;
public _packing Packing;
public _unpacking Unpacking;
public _quick_check QuickCheck;
public struct _chart
{
Stats s;
long _ms_time;
public _chart(Stats s)
: this()
{
this.s = s;
}
public int c_passive_edges;
public int c_active_edges;
public int c_root_edges;
public long ms_time { get { return _ms_time - s.Morphology.ms_time; } }
public double TimeRatio { get { return (double)ms_time / s.Totals.ms_time; } }
public void PassiveEdge() { Interlocked.Increment(ref c_passive_edges); }
public void ActiveEdge() { Interlocked.Increment(ref c_active_edges); }
public void RootEdge() { Interlocked.Increment(ref c_root_edges); }
public void SetElapsed(long ms) { _ms_time = ms; }
};
public struct _packing
{
public int c_tests;
public int c_proactive;
public int c_retroactive;
public int c_equivalence;
public void RecordEvent(sbyte sb)
{
Interlocked.Increment(ref c_tests);
if (sb == Subsumption.Equivalent)
Interlocked.Increment(ref c_equivalence);
else if (sb == Subsumption.FirstSubsumesSecond)
Interlocked.Increment(ref c_proactive);
else if (sb == Subsumption.SecondSubsumesFirst)
Interlocked.Increment(ref c_retroactive);
}
};
public struct _unpacking
{
Stats s;
public _unpacking(Stats s)
: this()
{
this.s = s;
}
public int c_restricted_parses;
public int c_rejected_derivations;
public int c_derivations;
public long ms_time { get { return s.Totals.ms_time - s.Parsing.Chart.ms_time - s.Morphology.ms_time; } }
public double TimeRatio { get { return (double)ms_time / s.Totals.ms_time; } }
public _unification Unification;
};
public struct _quick_check
{
public int c_evaluated;
public int c_avoided;
public double PercentAvoided { get { return c_evaluated == 0 ? double.NaN : c_avoided / (double)c_evaluated; } }
};
};
public struct _system_info
{
Stats s;
public _system_info(Stats s)
{
this.s = s;
}
public int ProcessorCount
{
get { return Environment.ProcessorCount; }
}
public bool Is64Bit
{
get { return Environment.Is64BitProcess; }
}
};
public struct _totals
{
Stats s;
public _totals(Stats s)
{
this.s = s;
this.ms_time = 0;
this.Unification = new _unification(s);
}
public _unification Unification;
public long ms_time;
public double sec_time { get { return ms_time / 1000.0; } }
public struct _unification
{
Stats s;
public _unification(Stats s)
{
this.s = s;
//this.QuickCheck = new _quick_check(s);
}
// public _quick_check QuickCheck;
public int c_attempted
{
get
{
return s.Morphology.Unification.c_attempted +
s.Parsing.Unification.c_attempted +
s.Parsing.Unpacking.Unification.c_attempted;
}
}
public int c_succeeded
{
get
{
return s.Morphology.Unification.c_succeeded +
s.Parsing.Unification.c_succeeded +
s.Parsing.Unpacking.Unification.c_succeeded;
}
}
//public struct _quick_check
//{
// Stats s;
// public _quick_check(Stats s)
// {
// this.s = s;
// }
// public int c_evaluated
// {
// get
// {
// return s.Morphology.Unification.QuickCheck.c_evaluated +
// s.Parsing.Unification.QuickCheck.c_evaluated;
// }
// }
// public int c_avoided
// {
// get
// {
// return s.Morphology.Unification.QuickCheck.c_avoided +
// s.Parsing.Unification.QuickCheck.c_avoided;
// }
// }
//};
};
}
};
};
}