3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-11 19:53:34 +00:00
z3/Microsoft.Z3/Statistics.cs
Leonardo de Moura 68269c43a6 other components
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:48:48 -07:00

207 lines
6.2 KiB
C#

/*++
Copyright (c) 2012 Microsoft Corporation
Module Name:
Statistics.cs
Abstract:
Z3 Managed API: Statistics
Author:
Christoph Wintersteiger (cwinter) 2012-03-22
Notes:
--*/
using System;
using System.Diagnostics.Contracts;
namespace Microsoft.Z3
{
/// <summary>
/// Objects of this class track statistical information about solvers.
/// </summary>
[ContractVerification(true)]
public class Statistics : Z3Object
{
/// <summary>
/// Statistical data is organized into pairs of [Key, Entry], where every
/// Entry is either a <c>DoubleEntry</c> or a <c>UIntEntry</c>
/// </summary>
public class Entry
{
/// <summary>
/// The key of the entry.
/// </summary>
readonly public string Key;
/// <summary>
/// The uint-value of the entry.
/// </summary>
public uint UIntValue { get { return m_uint; } }
/// <summary>
/// The double-value of the entry.
/// </summary>
public double DoubleValue { get { return m_double; } }
/// <summary>
/// True if the entry is uint-valued.
/// </summary>
public bool IsUInt { get { return m_is_uint; } }
/// <summary>
/// True if the entry is double-valued.
/// </summary>
public bool IsDouble { get { return m_is_double; } }
/// <summary>
/// The string representation of the the entry's value.
/// </summary>
public string Value
{
get
{
Contract.Ensures(Contract.Result<string>() != null);
if (IsUInt)
return m_uint.ToString();
else if (IsDouble)
return m_double.ToString();
else
throw new Z3Exception("Unknown statistical entry type");
}
}
/// <summary>
/// The string representation of the Entry.
/// </summary>
public override string ToString()
{
return Key + ": " + Value;
}
#region Internal
readonly private bool m_is_uint = false;
readonly private bool m_is_double = false;
readonly private uint m_uint = 0;
readonly private double m_double = 0.0;
internal Entry(string k, uint v) { Key = k; m_is_uint = true; m_uint = v; }
internal Entry(string k, double v) { Key = k; m_is_double = true; m_double = v; }
#endregion
}
/// <summary>
/// A string representation of the statistical data.
/// </summary>
public override string ToString()
{
return Native.Z3_stats_to_string(Context.nCtx, NativeObject);
}
/// <summary>
/// The number of statistical data.
/// </summary>
public uint Size
{
get { return Native.Z3_stats_size(Context.nCtx, NativeObject); }
}
/// <summary>
/// The data entries.
/// </summary>
public Entry[] Entries
{
get
{
Contract.Ensures(Contract.Result<Entry[]>() != null);
Contract.Ensures(Contract.Result<Entry[]>().Length == this.Size);
Contract.Ensures(Contract.ForAll(0, Contract.Result<Entry[]>().Length, j => Contract.Result<Entry[]>()[j] != null));
uint n = Size;
Entry[] res = new Entry[n];
for (uint i = 0; i < n; i++)
{
Entry e;
string k = Native.Z3_stats_get_key(Context.nCtx, NativeObject, i);
if (Native.Z3_stats_is_uint(Context.nCtx, NativeObject, i) != 0)
e = new Entry(k, Native.Z3_stats_get_uint_value(Context.nCtx, NativeObject, i));
else if (Native.Z3_stats_is_double(Context.nCtx, NativeObject, i) != 0)
e = new Entry(k, Native.Z3_stats_get_double_value(Context.nCtx, NativeObject, i));
else
throw new Z3Exception("Unknown data entry value");
res[i] = e;
}
return res;
}
}
/// <summary>
/// The statistical counters.
/// </summary>
public string[] Keys
{
get
{
Contract.Ensures(Contract.Result<string[]>() != null);
uint n = Size;
string[] res = new string[n];
for (uint i = 0; i < n; i++)
res[i] = Native.Z3_stats_get_key(Context.nCtx, NativeObject, i);
return res;
}
}
/// <summary>
/// The value of a particular statistical counter.
/// </summary>
/// <remarks>Returns null if the key is unknown.</remarks>
public Entry this[string key]
{
get
{
uint n = Size;
Entry[] es = Entries;
for (uint i = 0; i < n; i++)
if (es[i].Key == key)
return es[i];
return null;
}
}
#region Internal
internal Statistics(Context ctx, IntPtr obj)
: base(ctx, obj)
{
Contract.Requires(ctx != null);
}
internal class DecRefQueue : Z3.DecRefQueue
{
public override void IncRef(Context ctx, IntPtr obj)
{
Native.Z3_stats_inc_ref(ctx.nCtx, obj);
}
public override void DecRef(Context ctx, IntPtr obj)
{
Native.Z3_stats_dec_ref(ctx.nCtx, obj);
}
};
internal override void IncRef(IntPtr o)
{
Context.Statistics_DRQ.IncAndClear(Context, o);
base.IncRef(o);
}
internal override void DecRef(IntPtr o)
{
Context.Statistics_DRQ.Add(o);
base.DecRef(o);
}
#endregion
}
}