summaryrefslogtreecommitdiff
path: root/Analizator9000
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2012-11-17 13:55:44 +0000
committeremkael <emkael@tlen.pl>2012-11-17 13:55:44 +0000
commit732d3a0a0cf46cd041748d8b0f81d26e1e459a0a (patch)
treeacf1526ee7f29706f87443e845bbe58eb989e751 /Analizator9000
parent4ef50b1d961130eb86b5a0e10431b3847ff849eb (diff)
* code documentation
git-svn-id: https://svn.emkael.info/an9k@19 05ec0d5d-773b-4d93-9e23-c81a7ac79feb
Diffstat (limited to 'Analizator9000')
-rw-r--r--Analizator9000/Analizator9000/Accumulator.cs67
-rw-r--r--Analizator9000/Analizator9000/Analizator9000.csproj3
-rw-r--r--Analizator9000/Analizator9000/BCalcWrapper.cs95
-rw-r--r--Analizator9000/Analizator9000/Contract.cs21
-rw-r--r--Analizator9000/Analizator9000/DealerParser.cs24
-rw-r--r--Analizator9000/Analizator9000/DealerWrapper.cs47
-rw-r--r--Analizator9000/Analizator9000/Form1.Designer.cs1
-rw-r--r--Analizator9000/Analizator9000/Form1.cs146
-rw-r--r--Analizator9000/Analizator9000/Utils.cs9
9 files changed, 407 insertions, 6 deletions
diff --git a/Analizator9000/Analizator9000/Accumulator.cs b/Analizator9000/Analizator9000/Accumulator.cs
index 64dde12..0b5c228 100644
--- a/Analizator9000/Analizator9000/Accumulator.cs
+++ b/Analizator9000/Analizator9000/Accumulator.cs
@@ -6,17 +6,50 @@ using System.IO;
namespace Analizator9000
{
+ /// <summary>
+ /// Provided with a set of deals and contracts to check, conducts the actual statistics by gathering the results of BCalc analysis.
+ /// </summary>
class Accumulator
{
+ /// <summary>
+ /// Two-dimensional dictionary of accumulated analysis results (sample count, sample sum and sample square sum).
+ /// </summary>
private Dictionary<int, Dictionary<int, long[]>> sums;
+ /// <summary>
+ /// Number of deals already analyzed.
+ /// </summary>
private long analyzed = 0;
+ /// <summary>
+ /// Total number of deals to analyze.
+ /// </summary>
private long toAnalyze = 0;
+ /// <summary>
+ /// List (well, a stack) of deals to process.
+ /// </summary>
private Stack<String> deals;
+ /// <summary>
+ /// A back-reference to calling Form, for progress presentation purposes.
+ /// </summary>
private Form1 form;
+ /// <summary>
+ /// List of contracts to analyze in BCalc notation (integers for denomination and declarer).
+ /// </summary>
private Dictionary<int, List<int>> contracts;
+ /// <summary>
+ /// Results file handle (version of StreamWriter initialized as synchronized).
+ /// </summary>
private TextWriter outputFile;
+ /// <summary>
+ /// Filename for analysis output.
+ /// </summary>
private String filename;
+ /// <summary>
+ /// Accumulator constructor.
+ /// </summary>
+ /// <param name="deals">Array of deals to process, in BCalc's "NESW" format with prepended deal number for orientation.</param>
+ /// <param name="contracts">List of denomination-declarer pairs (structures).</param>
+ /// <param name="form">GUI instance.</param>
public Accumulator(String[] deals, List<Contract> contracts, Form1 form)
{
this.deals = new Stack<String>(deals);
@@ -51,8 +84,19 @@ namespace Analizator9000
this.outputFile = TextWriter.Synchronized(File.AppendText(@"files\"+this.filename));
}
+ /// <summary>
+ /// Number of threads initially run (and, subsequently, a maximum number that *should* be retained throughout analysis).
+ /// </summary>
private int portionSize = 10;
+ /// <summary>
+ /// Number of threads currently running.
+ /// </summary>
private int threadsRunning = 0;
+ /// <summary>
+ /// Initiates the analysis of a portion of deals.
+ /// </summary>
+ /// <param name="portionSize">Portion size. If set to 0, assumes the default/initial portion size.</param>
+ /// <returns>Number of deals left to analyze.</returns>
public int run(int portionSize = 0)
{
if (portionSize == 0)
@@ -69,6 +113,10 @@ namespace Analizator9000
return this.deals.Count;
}
+ /// <summary>
+ /// Worker method for a single deal.
+ /// </summary>
+ /// <param name="deal">Deal in BCalc's "NESW" format, with deal number prepended.</param>
private void analyzeDeal(String deal)
{
try
@@ -114,12 +162,22 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Flag stating whether the user aborted the analysis.
+ /// </summary>
private bool abort = false;
+ /// <summary>
+ /// Analysis abort method.
+ /// </summary>
public void abortAnalysis()
{
this.abort = true;
}
+ /// <summary>
+ /// Callback method for worker threads, ends the single deal analysis, updates the total result and fires next analysis if necessary.
+ /// </summary>
+ /// <param name="methodResult">Method invokation result from the worker method.</param>
private void endAnalyze(IAsyncResult methodResult)
{
((Action<String>)methodResult.AsyncState).EndInvoke(methodResult);
@@ -143,6 +201,7 @@ namespace Analizator9000
}
if (threadsRunning < this.portionSize)
{
+ // Increasing the parameter would cause exponential thread creation rate. Funny.
this.run(1);
}
}
@@ -158,6 +217,10 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Presents the current analysis results in textual form.
+ /// </summary>
+ /// <returns>Text table containing means and std. deviations for distinct contracts.</returns>
private String getString()
{
StringWriter sw = new StringWriter();
@@ -184,6 +247,10 @@ namespace Analizator9000
return sw.ToString();
}
+ /// <summary>
+ /// Feeds the overall results with chunks of data from single contract analysis.
+ /// </summary>
+ /// <param name="result">Result of BCalc analysis.</param>
private void update(BCalcResult result)
{
int tricks = result.tricks;
diff --git a/Analizator9000/Analizator9000/Analizator9000.csproj b/Analizator9000/Analizator9000/Analizator9000.csproj
index 89dafd7..321cce6 100644
--- a/Analizator9000/Analizator9000/Analizator9000.csproj
+++ b/Analizator9000/Analizator9000/Analizator9000.csproj
@@ -13,6 +13,7 @@
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
+ <IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
@@ -25,7 +26,6 @@
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
- <IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@@ -48,6 +48,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <DocumentationFile>bin\Release\Analizator9000.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Icon1.ico</ApplicationIcon>
diff --git a/Analizator9000/Analizator9000/BCalcWrapper.cs b/Analizator9000/Analizator9000/BCalcWrapper.cs
index c176117..556b419 100644
--- a/Analizator9000/Analizator9000/BCalcWrapper.cs
+++ b/Analizator9000/Analizator9000/BCalcWrapper.cs
@@ -7,11 +7,26 @@ using System.Text.RegularExpressions;
namespace Analizator9000
{
+ /// <summary>
+ /// Structure holding single deal analysis result.
+ /// </summary>
struct BCalcResult
{
+ /// <summary>
+ /// Trump denomination (N/S/H/D/C).
+ /// </summary>
public char trumpSuit;
+ /// <summary>
+ /// Declaring player (N/E/S/W).
+ /// </summary>
public char declarer;
+ /// <summary>
+ /// Number of tricks taken by the declaring side.
+ /// </summary>
public int tricks;
+ /// <summary>
+ /// Deal number, parsed out from input string.
+ /// </summary>
public long dealNo;
public BCalcResult(char a, char b, int c, long d)
{
@@ -21,33 +36,98 @@ namespace Analizator9000
dealNo = d;
}
};
+ /// <summary>
+ /// Wrapper class for libbcalcDDS.ddl.
+ /// </summary>
class BCalcWrapper
{
+ /// <summary>
+ /// Allocates new instance of BCalc solver.
+ /// </summary>
+ /// <param name="format">Deal format string. See the original documentation for details.</param>
+ /// <param name="hands">Card distribution.</param>
+ /// <param name="trump">Trump denomination, in numeric format. See the original documentation for details.</param>
+ /// <param name="leader">Player on lead, in numeric format. See the original documentation for details.</param>
+ /// <returns>Pointer to solver instance.</returns>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#ab636045f65412652246b769e8e95ed6f</remarks>
+ /// <todo>Enum/constants for trumps/players, definitely.</todo>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bcalcDDS_new(IntPtr format, IntPtr hands, Int32 trump, Int32 leader);
+ /// <summary>
+ /// Conducts DD analysis.
+ /// </summary>
+ /// <param name="solver">Pointer to solver instance.</param>
+ /// <returns>Number of tricks to take by leading side.</returns>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#a369ce661d027bef3f717967e42bf8b33</remarks>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern Int32 bcalcDDS_getTricksToTake(IntPtr solver);
+ /// <summary>
+ /// Checks for solver errors.
+ /// </summary>
+ /// <param name="solver">Pointer to solver instance.</param>
+ /// <returns>Error string or NULL if no error accured.</returns>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#a89cdec200cde91331d40f0900dc0fb46</remarks>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bcalcDDS_getLastError(IntPtr solver);
+ /// <summary>
+ /// Frees allocated solver instance and cleans up after it.
+ /// </summary>
+ /// <param name="solver">Pointer to solver instance.</param>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#a4a68da83bc7da4663e2257429539912d</remarks>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void bcalcDDS_delete(IntPtr solver);
+ /// <summary>
+ /// Sets trump denomination and resets the analysis.
+ /// </summary>
+ /// <param name="solver">Pointer to solver instance.</param>
+ /// <param name="trump">Trump denomination, in numeric format. See the original documentation for details.</param>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#a88fba3432e66efa5979bbc9e1f044164</remarks>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void bcalcDDS_setTrumpAndReset(IntPtr solver, Int32 trump);
+ /// <summary>
+ /// Sets leading player and resets the analysis.
+ /// </summary>
+ /// <param name="solver">Pointer to solver instance.</param>
+ /// <param name="player">Player on lead, in numeric format. See the original documentation for details.</param>
+ /// <remarks>Original documentation: http://bcalc.w8.pl/API_C/bcalcdds_8h.html#a616031c1e1d856c4aac14390693adb4c</remarks>
[DllImport(@"bin\libbcalcdds.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void bcalcDDS_setPlayerOnLeadAndReset(IntPtr solver, Int32 player);
+ /// <summary>
+ /// Translation table between player characters and numeric values.
+ /// </summary>
public static String table = "NESW";
+ /// <summary>
+ /// Translation table between denomination characters and numeric values.
+ /// </summary>
public static String denominations = "CDHSN";
+ /// <summary>
+ /// Pointer to solver instance.
+ /// </summary>
private IntPtr solver;
+ /// <summary>
+ /// Deal distribution.
+ /// </summary>
private String deal;
+ /// <summary>
+ /// Internal number of deal being analyzed.
+ /// </summary>
private long dealNo;
+ /// <summary>
+ /// Trump suit, in numeric format.
+ /// </summary>
private int trumps;
+
+ /// <summary>
+ /// Constructor of class instance for single deal analysis.
+ /// </summary>
+ /// <param name="deal">Deal distribution prefixed with deal number.</param>
public BCalcWrapper(String deal)
{
try
@@ -67,6 +147,10 @@ namespace Analizator9000
this.errorCheck();
}
+ /// <summary>
+ /// Sets the trump denomination.
+ /// </summary>
+ /// <param name="trumpSuit">Trump denomination, in numeric format.</param>
public void setTrump(int trumpSuit)
{
if (trumpSuit < 0)
@@ -78,6 +162,11 @@ namespace Analizator9000
this.trumps = trumpSuit;
}
+ /// <summary>
+ /// Runs the single contract analysis.
+ /// </summary>
+ /// <param name="declarer">Declaring player, in numeric format.</param>
+ /// <returns>Result structur for the contract.</returns>
public BCalcResult run(int declarer)
{
if (declarer < 0)
@@ -92,10 +181,16 @@ namespace Analizator9000
return new BCalcResult(BCalcWrapper.denominations[this.trumps], BCalcWrapper.table[declarer], 13 - result, this.dealNo);
}
+ /// <summary>
+ /// Releases the solver instaces.
+ /// </summary>
public void destroy() {
BCalcWrapper.bcalcDDS_delete(this.solver);
}
+ /// <summary>
+ /// Checks for errors, throws exception if any occured.
+ /// </summary>
private void errorCheck()
{
IntPtr error = BCalcWrapper.bcalcDDS_getLastError(this.solver);
diff --git a/Analizator9000/Analizator9000/Contract.cs b/Analizator9000/Analizator9000/Contract.cs
index f603ecd..0ef4fef 100644
--- a/Analizator9000/Analizator9000/Contract.cs
+++ b/Analizator9000/Analizator9000/Contract.cs
@@ -5,17 +5,38 @@ using System.Text;
namespace Analizator9000
{
+ /// <summary>
+ /// Tuple describing contract parameters. Created only because .NET 3.5 doesn't have Tuple type yet.
+ /// </summary>
class Contract: IEquatable<Contract>
{
+ /// <summary>
+ /// Trump denomination, in numeric format.
+ /// </summary>
+ /// <see cref="BCalcWrapper"/>
public int Denomination;
+ /// <summary>
+ /// Declaring player, in numeric format.
+ /// </summary>
+ /// <see cref="BCalcWrapper"/>
public int Declarer;
+ /// <summary>
+ /// Tuple constructor.
+ /// </summary>
+ /// <param name="denom">Trump denomination.</param>
+ /// <param name="decl">Declaring player.</param>
public Contract(int denom, int decl)
{
this.Denomination = denom;
this.Declarer = decl;
}
+ /// <summary>
+ /// IEquatable method for comparing (checking equality) of two tuples.
+ /// </summary>
+ /// <param name="other">Tuple to compare to.</param>
+ /// <returns>TRUE if both tuple components are equal.</returns>
public bool Equals(Contract other)
{
return this.Denomination == other.Denomination && this.Declarer == other.Declarer;
diff --git a/Analizator9000/Analizator9000/DealerParser.cs b/Analizator9000/Analizator9000/DealerParser.cs
index 80031fd..1ed640c 100644
--- a/Analizator9000/Analizator9000/DealerParser.cs
+++ b/Analizator9000/Analizator9000/DealerParser.cs
@@ -7,13 +7,32 @@ using System.Text.RegularExpressions;
namespace Analizator9000
{
+ /// <summary>
+ /// Parsers dealer script files into fileds used by the application and compiles deler script files from them.
+ /// </summary>
class DealerParser
{
+ /// <summary>
+ /// Contents of 'condition' section of dealer input script.
+ /// </summary>
public String condition = "";
+ /// <summary>
+ /// Limit of deals to generate, 'generate' section of input script.
+ /// </summary>
public long generate = -1;
+ /// <summary>
+ /// Limit of deals to produce, 'produce' section of input script.
+ /// </summary>
public long produce = -1;
+ /// <summary>
+ /// Pre-dealt cards, indexed by player. Compiles into 'predeal' section of onput script.
+ /// </summary>
public Dictionary<String, String[]> predeal = new Dictionary<String, String[]>();
+ /// <summary>
+ /// Loads the input script file and parses it. Parses out everything outside of predeal/condition/produce/generate/action sections.
+ /// </summary>
+ /// <param name="file">Filename of the script.</param>
public void loadFile(String file)
{
String[] contents = File.ReadAllLines(file);
@@ -107,6 +126,11 @@ namespace Analizator9000
}
}
}
+
+ /// <summary>
+ /// Compiles dealer input script from provided data. Assumes no overhead section and single action: printoneline.
+ /// </summary>
+ /// <returns>Input script contents.</returns>
public String saveFile()
{
String filename = Utils.getFilename("dealer");
diff --git a/Analizator9000/Analizator9000/DealerWrapper.cs b/Analizator9000/Analizator9000/DealerWrapper.cs
index 4184d8e..e538d5e 100644
--- a/Analizator9000/Analizator9000/DealerWrapper.cs
+++ b/Analizator9000/Analizator9000/DealerWrapper.cs
@@ -8,15 +8,42 @@ using System.Text.RegularExpressions;
namespace Analizator9000
{
+ /// <summary>
+ /// Runs dealer generator and captures its output.
+ /// </summary>
class DealerWrapper
{
+ /// <summary>
+ /// Calling user interfaces instance.
+ /// </summary>
private Form1 debugForm;
+ /// <summary>
+ /// Name of the input script file.
+ /// </summary>
private String scriptname;
+ /// <summary>
+ /// Stream to the generation results output file.
+ /// </summary>
private StreamWriter outputFile;
+ /// <summary>
+ /// Flag ensuring only one instance of dealer is running.
+ /// </summary>
private bool running = false;
+ /// <summary>
+ /// Number of lines (deals) to produce.
+ /// </summary>
private long produce = 0;
+ /// <summary>
+ /// Number of lines (deals) already produced.
+ /// </summary>
private long lineCount = 0;
+ /// <summary>
+ /// Dealer wrapper class constructor.
+ /// </summary>
+ /// <param name="scriptname">Input script file name.</param>
+ /// <param name="debugForm">Calling interface form.</param>
+ /// <param name="produce">Number of deals to produce.</param>
public DealerWrapper(String scriptname, Form1 debugForm, long produce)
{
if (!File.Exists(scriptname))
@@ -32,10 +59,19 @@ namespace Analizator9000
this.produce = produce;
}
+ /// <summary>
+ /// Sends a single line to debug field of the calling form.
+ /// </summary>
+ /// <param name="line">Message to be appended to the debug output.</param>
private void debugWriteLine(String line) {
this.debugForm.addStatusLine(line);
}
+ /// <summary>
+ /// Processes a chunk of dealer output.
+ /// </summary>
+ /// <param name="data">Output string of dealer instance.</param>
+ /// <returns>TRUE if dealer it still running, FALSE if null string arrived -> process ended.</returns>
private bool handleData(string data)
{
if (data != null)
@@ -59,12 +95,23 @@ namespace Analizator9000
return false;
}
+ /// <summary>
+ /// Closes the output file stream.
+ /// </summary>
public void closeFile()
{
this.outputFile.Close();
}
+ /// <summary>
+ /// Delegate for process end callback invocation.
+ /// </summary>
+ /// <param name="filename">Output file name.</param>
private delegate void onEndDelegate(String filename);
+ /// <summary>
+ /// Worker method for dealer generating.
+ /// </summary>
+ /// <param name="onEnd">Callback to the function which takes output file name as a parameter.</param>
public void run(Action<String> onEnd)
{
if (!this.running)
diff --git a/Analizator9000/Analizator9000/Form1.Designer.cs b/Analizator9000/Analizator9000/Form1.Designer.cs
index 040df35..d08e3b1 100644
--- a/Analizator9000/Analizator9000/Form1.Designer.cs
+++ b/Analizator9000/Analizator9000/Form1.Designer.cs
@@ -1002,7 +1002,6 @@
this.MaximizeBox = false;
this.Name = "Form1";
this.Text = "Analizator9000";
- this.Load += new System.EventHandler(this.Form1_Load);
this.generateGroup.ResumeLayout(false);
this.generateGroup.PerformLayout();
this.tableLayoutPanel1.ResumeLayout(false);
diff --git a/Analizator9000/Analizator9000/Form1.cs b/Analizator9000/Analizator9000/Form1.cs
index 14b33aa..aeaf56c 100644
--- a/Analizator9000/Analizator9000/Form1.cs
+++ b/Analizator9000/Analizator9000/Form1.cs
@@ -10,21 +10,40 @@ using System.IO;
namespace Analizator9000
{
+ /// <summary>
+ /// Main application window control.
+ /// </summary>
public partial class Form1 : Form
{
+ /// <summary>
+ /// Dealer input scripts parser instance.
+ /// </summary>
private DealerParser parser;
+ /// <summary>
+ /// Constructs the main window.
+ /// </summary>
public Form1()
{
InitializeComponent();
this.parser = new DealerParser();
}
+ /// <summary>
+ /// "Select file" button click, opens file selection dialog for input script.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
generateFileDialog.ShowDialog();
}
+ /// <summary>
+ /// Input script file selection event. Initiates input script parsing.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
try
@@ -70,10 +89,16 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// "Generate" button click. Saves the input script file and runs deals generating.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void generateButton_Click(object sender, EventArgs e)
{
generateGroup.Enabled = false;
analyzeGroup.Enabled = false;
+ statusListBox.Items.Clear();
progressBar.Value = 0;
try
{
@@ -118,7 +143,15 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Delegate for generating end method callback.
+ /// </summary>
+ /// <param name="filename"></param>
private delegate void endDelegate(String filename);
+ /// <summary>
+ /// Generating end callback method. Prints out deal generating summary.
+ /// </summary>
+ /// <param name="filename">Output (generated deals) file name.</param>
private void generateEnd(String filename)
{
if (this.InvokeRequired)
@@ -138,7 +171,15 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Delegate for debug line addition method.
+ /// </summary>
+ /// <param name="line"></param>
private delegate void AddStatusDelegate(String line);
+ /// <summary>
+ /// Debug line addition method (thread-safe).
+ /// </summary>
+ /// <param name="line">String to be appended to the debug output.</param>
public void addStatusLine(String line)
{
if (line != null)
@@ -155,7 +196,15 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Delegate for progress bar update method.
+ /// </summary>
+ /// <param name="progress">Percentage of progress to set (0-100)</param>
private delegate void SetProgressDelegate(int progress);
+ /// <summary>
+ /// Progress bar update method (thread-safe).
+ /// </summary>
+ /// <param name="progress">Percentage of progress to set (0-100)</param>
public void setProgress(int progress)
{
if (progressBar.InvokeRequired)
@@ -168,26 +217,41 @@ namespace Analizator9000
}
}
- private void Form1_Load(object sender, EventArgs e)
- {
- }
-
+ /// <summary>
+ /// Deals file selection event. Sets the deals file path in the text field.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void analyzeFileDialog_FileOk(object sender, CancelEventArgs e)
{
analyzeFileNameTextBox.Text = analyzeFileDialog.FileName;
}
+ /// <summary>
+ /// "Select file" button click for deals file selection.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
analyzeFileDialog.ShowDialog();
}
+ /// <summary>
+ /// Instance of analysis summary class.
+ /// </summary>
private Accumulator ac;
+ /// <summary>
+ /// "Analyze" button click. Runs the analysis.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void analyzeButton_Click(object sender, EventArgs e)
{
analyzeGroup.Enabled = false;
generateGroup.Enabled = false;
abortButton.Enabled = true;
+ statusListBox.Items.Clear();
this.addStatusLine("Otwieram plik: " + analyzeFileNameTextBox.Text);
try
{
@@ -220,7 +284,13 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Delegate for analysis end callback method.
+ /// </summary>
private delegate void EndAnalysisDelegate();
+ /// <summary>
+ /// Analysis end callback method. Cleans up visually after the analysis.
+ /// </summary>
public void endAnalysis()
{
if (this.InvokeRequired)
@@ -237,7 +307,15 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Delegate for result summary display method.
+ /// </summary>
+ /// <param name="res">Result summary string.</param>
private delegate void SetResultDelegate(String res);
+ /// <summary>
+ /// Displays analysis results summary.
+ /// </summary>
+ /// <param name="res">Result summary string.</param>
public void setResult(String res)
{
if (this.InvokeRequired)
@@ -250,6 +328,11 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// "Abort" button click event.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void abortButton_Click(object sender, EventArgs e)
{
if (this.ac != null)
@@ -258,6 +341,11 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Mass checkboxes within contract table layout toggle method.
+ /// </summary>
+ /// <param name="xRange">Set of x-coordinates for checkboxes to toggle.</param>
+ /// <param name="yRange">Set of y-coordinates for checkboxes to toggle.</param>
private void toggleBoxes(IEnumerable<int> xRange, IEnumerable<int> yRange)
{
foreach (int x in xRange)
@@ -270,51 +358,101 @@ namespace Analizator9000
}
}
+ /// <summary>
+ /// Toggles all contract chackboxes.
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the first column of checkboxes ("NT").
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label18_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 1), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the second column of checkboxes (spades).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label14_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(2, 1), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the third column of checkboxes (hearts).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label15_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(3, 1), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the fourth column of checkboxes (diamonds).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label16_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(4, 1), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the fifth column of checkboxes (clubs).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label17_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(5, 1), Enumerable.Range(1, 4));
}
+ /// <summary>
+ /// Toggles the first row of checkboxes (North).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label19_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(1, 1));
}
+ /// <summary>
+ /// Toggles the second row of checkboxes (East).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label20_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(2, 1));
}
+ /// <summary>
+ /// Toggles the third row of checkboxes (South).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label21_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(3, 1));
}
+ /// <summary>
+ /// Toggles the fourth row of checkboxes (West).
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
private void label22_Click(object sender, EventArgs e)
{
this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(4, 1));
diff --git a/Analizator9000/Analizator9000/Utils.cs b/Analizator9000/Analizator9000/Utils.cs
index eefaa9b..3fbd4ac 100644
--- a/Analizator9000/Analizator9000/Utils.cs
+++ b/Analizator9000/Analizator9000/Utils.cs
@@ -5,8 +5,17 @@ using System.Text;
namespace Analizator9000
{
+ /// <summary>
+ /// Random utility class.
+ /// </summary>
+ /// <todo>Merge with Contract, probably.</todo>
class Utils
{
+ /// <summary>
+ /// Provides a timestamped filename in uniform format.
+ /// </summary>
+ /// <param name="extension">Desired file extension.</param>
+ /// <returns>Filename prefixed with program identificator, containing a timestamp for request.</returns>
static public String getFilename(String extension)
{
return "an9k-" + DateTime.Now.ToString("yyyyMMddHHmmssFFF") + "." + extension;