<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.opensourcedotnet.info/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Opensource</title><link>http://community.opensourcedotnet.info/blogs/</link><description>Community for opensource projects by Christoph Rüegg</description><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Complete Iridium Feature List</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/11/04/complete-iridium-feature-list.aspx</link><pubDate>Tue, 04 Nov 2008 21:08:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56216</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I have much more time for Math.NET from now on than in the past. As a first step I&amp;#39;ve finally collected and summarized all Math.NET Iridium features in a list:&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathnet.opensourcedotnet.info/doc/IridiumFeatures.ashx"&gt;http://mathnet.opensourcedotnet.info/doc/IridiumFeatures.ashx &lt;/a&gt;&lt;/p&gt;&lt;p&gt;Beside of the continuous Iridium work I also plan to finally bring Math.NET Classic (traditional symbolic computer algebra) back to live.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56216" width="1" height="1"&gt;</description></item><item><title>Iridium 2008 August Release (2008.8.16.470)</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/08/14/IridiumRelease2008Auust470.aspx</link><pubDate>Thu, 14 Aug 2008 12:14:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56173</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Iteration 16 of Math.NET Iridium (Numerics) is now available, as 2008 August Release with Version 2008.8.16.470. &lt;b&gt;Grab it &lt;a href="http://mathnet.opensourcedotnet.info/downloads/Iridium-2008.8.16.470.ashx"&gt;here&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Please continue
reporting issues and bugs you find, it&amp;#39;s very useful and helps making
the whole project better. We&amp;#39;ve also setup a &lt;a href="http://mathnet.uservoice.com/"&gt;UserVoice&lt;/a&gt; page for you to suggest or vote for new features or enhancement. &lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Team:&lt;/span&gt; Christoph Rüegg, Joannès Vermorel, Matthew Kitchin&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Summary:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Bugs: 4 bugs have been fixed.&lt;/li&gt;&lt;li&gt;Completely revised and extended interpolation toolkit.&lt;/li&gt;&lt;li&gt;New complex matrix and vector type (Complex Linear Algebra will follow in the next iteration).&lt;/li&gt;&lt;li&gt;Slightly enhanced real matrix and vector types .&lt;/li&gt;&lt;li&gt;QR decompositions are now unique (positive real R diagonal).&lt;/li&gt;&lt;li&gt;Complex type now has a public constructor, more intuitive.&lt;/li&gt;&lt;li&gt;New Digamma (Psi) special function.&lt;/li&gt;&lt;li&gt;Various other small changes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For more details have a look at the &lt;a href="http://mathnet.opensourcedotnet.info/downloads/Iridium-2008.8.16.470.ashx"&gt;download page&lt;/a&gt; or at the &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;Iridium tracker change log&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56173" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Blog/default.aspx">Blog</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>Revised Interpolation Toolkit in Iridium</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/05/10/IridiumRevisedInterpolationToolkit.aspx</link><pubDate>Sat, 10 May 2008 15:31:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56132</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The next release of Math.NT Iridium, Iteration 16, comes with a revised interpolation architecture and implementation.&lt;/p&gt;&lt;p&gt;Up to now, the interpolation classes have been a bit akward to use, partially because of the SampleList collection class you had to use, and because of the design in general. It also provided only two interpolation algorithms, which are both somewhat outdated these days.&lt;/p&gt;&lt;p&gt;The new implementation provides some newer more stable algorithms (like Floater and Hormann&amp;#39;s algorithm for pole-free rational interpolation) together with a cleaner&amp;nbsp; design. Additionally, some of the algoriths can also provide the first and second derivative and in the case of splines even a definite integration. There is also a new facade/portal class that reduces building an interpolation to one simple method call. Usually you would just use this facade class to build/precompute an interpolation, but all the algorithms are also publicly available in the Algorithms-namespace, so if you know what you&amp;#39;re doing you can use them directly.&lt;/p&gt;&lt;p&gt;Sample code, which uses a pole-free rational barycentric interpolation (the default algorithm) with 5 given sample pairs (t, x(t)):&lt;/p&gt;&lt;div style="font-family:courier;"&gt;&lt;p&gt;double[] t = new double[] { -2, -1, 0, 1, 2};&lt;br /&gt;double[] x = new double[] { 1, 2, -1, 0, 1};&lt;br /&gt;&lt;br /&gt;IInterpolationMethod method =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interpolation.Create(t, x);&lt;br /&gt;&lt;br /&gt;double res = method.Interpolate(0.5);&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Simple, isn&amp;#39;t it?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Unfortunately it was not possible to fit the new design into the old classes, so the new classes and interfaces replace the old classes completely. These old classes are still there for now and continue to work, but they&amp;#39;re marked as obsolete and we recommend strongly to upgrade your code base to the new architecture.&lt;/p&gt;&lt;p&gt;The new architecture has already been checked in to the &lt;a href="http://mathnet.opensourcedotnet.info/Repository.aspx"&gt;source repository&lt;/a&gt;. If you&amp;#39;re interested, please have a look at it and provide feedback - it&amp;#39;s not released yet so we can still change it completely :).  &lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56132" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Interpolation/default.aspx">Interpolation</category></item><item><title>Iridium 2008 April Release (v2008.4.14.425)</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/04/06/IridiumRelease2008Arpil425.aspx</link><pubDate>Sun, 06 Apr 2008 11:50:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56124</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Iteration 14 of Math.NET Iridium (Numerics) is now available, as 2008 April Release with Version 2008.4.14.425. &lt;b&gt;Grab it &lt;a href="http://community.opensourcedotnet.info/files/folders/mathnet/entry56122.aspx"&gt;here&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Sorry for the very short release cycle (just one week after iteration 12). The reason is that I won&amp;#39;t be able to work on Math.NET for the next three weeks and that some of the fixes and changes are important enough to not let you wait three weeks for no reason.&lt;/p&gt;&lt;p&gt;Please continue reporting issues and bugs you find, it&amp;#39;s very useful and helps making the whole project better. There&amp;#39;s also a big chance that the issue will actually be fixed: in the last few releases we always managed to fix all bugs we were aware of at that point. Thanks!&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Team:&lt;/span&gt; Christoph Rüegg, Joannès Vermorel, Matthew Kitchin&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Summary:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Bugs: All known 3 bugs have been fixed.&lt;/li&gt;&lt;li&gt;Better special function precision (Gamma, Beta, Erf, Distributions etc): now up to 12 - 14 digits. &lt;/li&gt;&lt;li&gt;New direct/real gamma function, new harmonic number function.&lt;/li&gt;&lt;li&gt;Interpolation: usability enhancements (better double-array support, less user code) &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;New Features:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IRID-122: Core - New direct Gamma function (additional to GammaLn) with negative value support&lt;/li&gt;&lt;li&gt;IRID-123: Core - New Special Function: Harmonic Numbers&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight:bold;"&gt;Enhancements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IRID-121: Core - Better numerical precision for Gamma function&lt;/li&gt;&lt;li&gt;IRID-125: Interpolation - Additional interpolation and sample list constructors for double arrays.&lt;/li&gt;&lt;li&gt;IRID-126: Interpolation - Better interpolation order access and defaults&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight:bold;"&gt;Fixed Bugs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IRID-119: Interpolation - Polynomial Extrapolation in positive direction throws IndexOutOfRangeException&lt;/li&gt;&lt;li&gt;IRID-120: Linear Algebra - Infinite recursion&lt;/li&gt;&lt;li&gt;IRID-124: Linear Algebra - Matrix.CopyToArray - wrong indexer in inner loop condition.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For more details have a look at the &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;Iridium tracker change log&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56124" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Neodym/default.aspx">Neodym</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>Iridium 2008 March Release (v2008.3.12.405)</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/03/31/IridiumRelease2008March405.aspx</link><pubDate>Mon, 31 Mar 2008 09:41:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56107</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Iteration 12 of Math.NET Iridium (Numerics) is now available, as 2008 March Release with Version 2008.3.12.405. &lt;b&gt;Grab it &lt;a href="http://community.opensourcedotnet.info/files/folders/mathnet/entry56105.aspx"&gt;here&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Team:&lt;/span&gt; Christoph Rüegg, Joannès Vermorel, Matthew Kitchin&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;New Contributions:&lt;/span&gt; Mike Shugai&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Summary:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Bugs:&lt;/b&gt; All know&lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;&lt;/a&gt; 3 bugs have been fixed.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Linear Algera:&lt;/b&gt; Matrix Kronecker product, new Vector class, performance work (caching).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Core&lt;/b&gt;&lt;b&gt;:&lt;/b&gt; New Sinc function, Neper/Decibel ratio routines.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Probability Distributions&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;
New distributions: Student&amp;#39;s T-Distribution, F-Distribution, Skew-Alpha Stable Distribution. &lt;/li&gt;&lt;li&gt;Assemblies no longer signed with a certificate (because verification caused network access).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;New Features:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IRID-113: Core - Neper and Decibel Helper and Factors&lt;/li&gt;&lt;li&gt;IRID-116: Core - Sinc Function&lt;/li&gt;&lt;li&gt;IRID-111: Linear Algebra - Matrix Kronecker Tensor Product&lt;/li&gt;&lt;li&gt;RID-59: Linear Algebra - New Vector class (related to the Matrix class)&lt;/li&gt;&lt;li&gt;IRID-99: Probability Distributions - New Distribution: Skew Alpha Stable Distribution&lt;/li&gt;&lt;li&gt;IRID-108: Probability Distributions - New Distribution: F-Distribution&lt;/li&gt;&lt;li&gt;IRID-109: Probability Distributions - New Distribution: Student&amp;#39;s-T&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight:bold;"&gt;Enhancements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IRID-106: Linear Algebra - Cache for on-demand computations (like decompositions)&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight:bold;"&gt;Fixed Bugs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IRID-107: Core - Complex: Unexpected power behavior at zero&lt;/li&gt;&lt;li&gt;IRID-97: Linear Algebra - Matrix.Identity allocation bug in non-square cases&lt;/li&gt;&lt;li&gt;IRID-98: Probability Distributions - ArbitraryDistribution NextInt32 does not consider offset.&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight:bold;"&gt;Other:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IRID-110: Remove Certificate Signing (cert validation causes network access)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For more details have a look at the &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;Iridium tracker change log&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56107" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Neodym/default.aspx">Neodym</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>Math.NET Tightened Security - working fine for you?</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/02/09/MathNetTightenedSecurity.aspx</link><pubDate>Sat, 09 Feb 2008 11:57:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56052</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Since the &lt;a href="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/02/03/IridiumRelease2008February364.aspx"&gt;February 2008 Release&lt;/a&gt;, Math.NET Iridium and Neodym both adapted a new security model: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Strong Name:&lt;/b&gt; The official assemblies are now strong named. This means that you can put them into the global assembly cache, configure .NET code access policies, and prevent anyone from injecting bad code into the assembly or replace it completely.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Delayed and Test Signing: &lt;/b&gt;Other than other opensource projects we don&amp;#39;t make the private key of our strong name signing key publicly available. Instead we use delay and test signing for everyone who develops directly from the source code repository: the assemblies are delay signed with the official public key, but then are test-signed with individual keys you can easily create and register yourself (by running a batch file). If you have concerns about relaying on strong named assemblies where you don&amp;#39;t have access to the private key, simply re-sign the assembly with your own key pair of choice...&lt;/li&gt;&lt;li&gt;&lt;b&gt;Code Access Security:&lt;/b&gt; The assemblies don&amp;#39;t run as full-trust anymore but instead are locked down and refuse nearly all system-provided permissions including any file I/O, network access, reflection and unmanaged code. With this we guarantee that we don&amp;#39;t do anything bad on your system and that nobody can misuse the library to do bad things through this library. That&amp;#39;s why we now also &lt;b&gt;allow partially trusted callers&lt;/b&gt; - i.e. you can use the library even from a network share or directly from the internet, or from assemblies the user doesn&amp;#39;t need trust fully.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Signed with a certificate:&lt;/b&gt; All the official assemblies are now also signed with a certificate to certify authenticy. However, this has no effect on using the library in your own project, and the root certificate used to create the code signing certificate is not generally known (and of course not distributed with Microsoft Windows).&lt;/li&gt;&lt;/ul&gt;This tightened security aspects might also have effects on your code. Please let me know if you have an issue with these changes, if it breaks your code, makes it much slower or whatever. Thanks.&lt;br /&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56052" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Neodym/default.aspx">Neodym</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Security/default.aspx">Security</category></item><item><title>Iridium 2008 February Release (v2008.2.10.364)</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2008/02/03/IridiumRelease2008February364.aspx</link><pubDate>Sun, 03 Feb 2008 11:39:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:56040</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Iteration 10 of Math.NET Iridium (Numeric) is now available, as 2008 February Release with Version 2008.2.10.364. &lt;b&gt;Grab it &lt;a href="http://community.opensourcedotnet.info/files/folders/mathnet/entry56036.aspx"&gt;here&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;This is mostly a service release:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Bugs:&lt;/b&gt; All known &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;8 bugs&lt;/a&gt; have been fixed.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Performance:&lt;/b&gt; The linear algebra implementation has ben optimized, resulting in &lt;a href="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/10/14/IridiumMatrixPerformanceImprovement.aspx"&gt;nearly 50% perf gain&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Api References:&lt;/b&gt; Inline Xml Documentation has been improved (but is still far from where we&amp;#39;d like it to be).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Security:&lt;/b&gt; The released binaries now have a strong name, are locked down with code access security and allow partial trusted callers. We now use test-signing internally. Also, the official assemblies are now signed with a certificate. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Build/Release Integration:&lt;/b&gt; We now moved completely to custom msbuild targets, releases are now fully automated (incl. documentation generation) and the continuous integration system has been upgraded. Since releasing is now much easier, you can expect new releases more often.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For the complete list of changes have a look at the &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?IRID=ChangeLog"&gt;Iridium tracker change log&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;At the same time I also released a first version of Math.NET Neodym (Signal Processing), Iteration 2 what makes it Version 2008.2.2.364. Grab it &lt;a href="http://community.opensourcedotnet.info/files/folders/mathnet/entry56035.aspx"&gt;here&lt;/a&gt;. Hopefully I&amp;#39;ll have more time in the future to work on Neodym... &lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=56040" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Neodym/default.aspx">Neodym</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>Matrix data structure optimization: Nearly 50% perf gain</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/10/14/IridiumMatrixPerformanceImprovement.aspx</link><pubDate>Sun, 14 Oct 2007 19:28:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55864</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Some time ago I did some very basic &lt;a class="" href="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/04/15/Iridium-Performance-Analysis.aspx"&gt;performance analysis of solving linear equation systems&lt;/a&gt; with Iridium. Since then we decided to rewrite the Matrix class to use jagged arrays instead of rectangular ones, see &lt;a class="" href="http://community.opensourcedotnet.info/forums/t/384.aspx"&gt;this forum discussion&lt;/a&gt;. There already was a discussion about that issue some long time ago, but at that time we decided to go for the more clean and safe way of rectangular arrays. Unfortunately the C# compiler today still can&amp;#39;t optimize loops on rectangular arrays as good as loops on jagged arrays. So we finally moved forward to jagged arrays, and indeed, we got a performance improvement (solving a linear equation system) by nearly 50%.&lt;/p&gt;
&lt;p&gt;Unfortunately, the change of the data structure comes at a cost: The semantics of the two following members changes, as they now do deep-copies instead of using the data structure directly as internal data structure. Have a look at the mentioned forum discussion on why this might be an issue.&lt;/p&gt;
&lt;p&gt;public Matrix(double[,] A)&lt;br /&gt;public static implicit operator double[,] (Matrix m)&lt;/p&gt;
&lt;p&gt;If you want to avoid deep-copying, e.g. for performance reasons, then use double[][] instead of double[,] to fill the matrix.&lt;/p&gt;
&lt;p&gt;The changes are already submitted to the &lt;a class="" href="http://mathnet.opensourcedotnet.info/Repository.aspx"&gt;subversion repository&lt;/a&gt;, and will be included in the next &lt;a class="" href="http://mathnet.opensourcedotnet.info/doc/Releases.ashx"&gt;iridium release&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55864" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Linear+Algebra/default.aspx">Linear Algebra</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Encrypt local mail folders and the desktop search index</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2007/08/25/EncryptDesktopSearchIndexAndMailFolders.aspx</link><pubDate>Sat, 25 Aug 2007 18:10:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55825</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;m using &lt;a href="http://www.truecrypt.org/"&gt;TrueCrypt&lt;/a&gt; to encrypt all kind of files on my computer (and on all external harddrives and most USB thumbdrives) for quite some time now and I really like it. On the PC I have a set of data I want to have encrypted but that I always need, so I&amp;#39;ve configured it to automatically mount it as &lt;span style="font-weight:bold;"&gt;X:\&lt;/span&gt; after login (that is, I just have to enter my password, hit enter and forget about it). One of this kind of data is the web browser bookmarks, history and cache. Luckily the &lt;a href="http://www.mozilla-europe.org/de/products/firefox/"&gt;Firefox&lt;/a&gt; browser allows you to store the profile wherever you want, so I simply store it on that virtual drive &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt; mentioned before.&lt;/p&gt;&lt;p&gt;Desktop Search is very useful (be it Google Desktop or Microsoft Desktop Search or whatever). However, what&amp;#39;s the point of encrypting files when they&amp;#39;re full-text indexed to some unencrypted location anyway. Hence I want this index to be stored on that encrypted drive &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Issue:&lt;/span&gt;&lt;span style="text-decoration:underline;"&gt; &lt;/span&gt;The Windows Desktop Search service starts before I can enter the password and mount &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt;. If it can&amp;#39;t access the index, it automatically starts generating a new index at the default (and unencrypted) location. So I need some way of delaying the service start. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In addition I also want my local mail folder encrypted on &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt;. Similar to Firefox, the Mozilla email client &lt;a href="http://www.mozilla-europe.org/de/products/thunderbird/"&gt;Thunderbird&lt;/a&gt; allows my to store the profile wherever I want, so I chose to store it directly on &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt;. However, I also use Outlook 2007, and there it&amp;#39;s not that simple:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Issue:&lt;/span&gt; While Outlook 2007 allows you to store the main post folder wherever you want, for some yet unknown reason you can&amp;#39;t move IMAP or Exchange data folders.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Luckily there is a workaround for both issues, although it&amp;#39;s not trivial and involves some coding. Here&amp;#39;s what I did, let me know if you have a better solution (the NTFS built-in encryption is no option for me), or if you&amp;#39;re interested in the code:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Change the Search Index Service to start manually (instead of automatically)&lt;/li&gt;&lt;li&gt;Write a small windows service that starts automatically and checks all few seconds whether &lt;span style="font-weight:bold;"&gt;X &lt;/span&gt;is mounted. If it is, it stops further checking and starts the Search Index Service.&lt;/li&gt;&lt;li&gt;Move all files from the outlook data folder (something like Documents and Settings\..\Local Settings\Application Data\Microsoft\Office) to a new folder in &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt; and delete this Outlook folder&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Have the small windows service (from point 2) create an &lt;a href="http://www.codeproject.com/cs/files/JunctionPointsNet.asp"&gt;NTFS Junction&lt;/a&gt; (aka symlink) in place of the just deleted Outlook folder, and point it to the new directory in &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt;, as soon as &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt; is mounted; and remove this junction again once the service stops. This makes Outlook 2007 think the files are still where it expects it, but in reality they&amp;#39;re on &lt;span style="font-weight:bold;"&gt;X&lt;/span&gt; instead.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55825" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/NTFS/default.aspx">NTFS</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/EMail/default.aspx">EMail</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Encryption/default.aspx">Encryption</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/SSL/default.aspx">SSL</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Math.NET Iridium on Linux and Mono</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/08/19/MathNetOnMonoLinux.aspx</link><pubDate>Sun, 19 Aug 2007 16:43:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55821</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;One of the principles of the Math.NET Iridium numerics library is to not depend on special hardware or some external super-optimized library, but just on the core .Net Framework 2.0. Thanks to this, Iridium also works with Mono on Linux with no special treatment - just add a reference to the assembly in MonoDevelop and start coding...&lt;/p&gt;&lt;p&gt;Apparently some users are not used to reference .Net assemblies on Mono yet, so I&amp;#39;ve created some screen shots showing how to add such a reference step-by-step in MonoDevelop on Ubuntu Linux:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://mathnet.opensourcedotnet.info/doc/MathNetOnMonoLinux.ashx"&gt;Math.NET on Mono (and Linux)&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55821" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Wiki/default.aspx">Wiki</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Mono/default.aspx">Mono</category></item><item><title>Capture Keyboard Input in WPF</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2007/05/08/capture-keyboard-input-in-wpf.aspx</link><pubDate>Tue, 08 May 2007 11:17:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55735</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In case you every need to capture some keyboard input&amp;nbsp;similar to a TextBox&amp;nbsp;but without a&amp;nbsp;TextBox (hence you also want to capture input that - on some keyboard layouts - need a secondary key to type (like % on my layout = Shift+5), but don&amp;#39;t care whether the user presses special keys like&amp;nbsp;Shift or Ctrl, or&amp;nbsp;whether the num block was used to enter a number): Don&amp;#39;t try to start with KeyDown or KeyUp, they won&amp;#39;t help much. Instead, register a text input handler on the TextCompositonManager:&lt;/p&gt;
&lt;div style="margin:0px;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;
&lt;div style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;TextCompositionManager.AddTextInputHandler(&lt;span class="keyword"&gt;this&lt;/span&gt;,&lt;img src="http://www.zedilabs.com/wrapglyph.png" style="vertical-align:bottom;" alt="wrap glyph" /&gt;&lt;br /&gt;new&amp;nbsp;TextCompositionEventHandler(OnTextComposition));&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;...and then simply use the event handler argument&amp;#39;s Text property:&lt;/p&gt;
&lt;div style="margin:0px;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;
&lt;div style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;void&lt;/span&gt;&amp;nbsp;OnTextComposition(&lt;span class="keyword"&gt;object&lt;/span&gt;&amp;nbsp;sender,&lt;img src="http://www.zedilabs.com/wrapglyph.png" style="vertical-align:bottom;" alt="wrap glyph" /&gt;&lt;br /&gt;TextCompositionEventArgs&amp;nbsp;e)&amp;nbsp;&lt;br /&gt;{&lt;/div&gt;
&lt;div style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string key = e.Text;&lt;/div&gt;
&lt;div style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/div&gt;
&lt;div style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And you get the keyboard layout and system key tracking for free.&lt;/p&gt;
&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55735" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Bits+and+Bytes/default.aspx">Bits and Bytes</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Iridium Performance Analysis</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/04/15/Iridium-Performance-Analysis.aspx</link><pubDate>Sun, 15 Apr 2007 00:30:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55692</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>3</slash:comments><description>
&lt;p&gt;I started performing some very basic performance analysis of interesting parts of the Math.NET Iridium (Numerics) Library, motivated by a &lt;a href="http://dev.cdrnet.net/cs/forums/thread/55654.aspx"&gt;forum post&lt;/a&gt;.&lt;/p&gt;
 &lt;h4&gt;Machine Configuration&lt;/h4&gt; 
&lt;p&gt;I tested it on the following computers:&lt;/p&gt;
 
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;: Desktop, Intel &lt;strong&gt;P4, 3.4 GHz&lt;/strong&gt;, XP SP2&lt;br /&gt;
&lt;strong&gt;B&lt;/strong&gt;: Notebook, Intel &lt;strong&gt;Core 2 Duo, 2 GHz&lt;/strong&gt;, XP MCE SP2&lt;br /&gt;&lt;strong&gt;C&lt;/strong&gt;: Desktop, Intel &lt;strong&gt;Core 2 Duo, 2.&lt;em&gt;??&lt;/em&gt; GHz&lt;/strong&gt;, XP SP2&lt;br /&gt;&lt;/p&gt;
 
&lt;p&gt;On both machines there are lots of other processes running, hence I start the&amp;nbsp;app with high priority.&amp;nbsp;&lt;/p&gt;
 

 &lt;h4&gt;Test Strategy&lt;/h4&gt; 
&lt;p&gt;Quite simple (for a start): I run different problem sets. For each set I first run it two times (warm up, to let the JIT compiler do its work), then start a timer/stopwatch, run it five times, stop the timer and divide the resulting time span through five, to get an average.&lt;/p&gt;
 &lt;h4&gt;Case 1: Fourier Transform&lt;br /&gt;
&lt;/h4&gt; 
&lt;p&gt;I tested the forward fourier transform on a real sample set of doubles with seven different sample set lengths:&lt;/p&gt;
 
&lt;table&gt;  
&lt;tr&gt; 
&lt;td&gt;Set Length:&lt;/td&gt;
 
&lt;td&gt;A:&lt;/td&gt;
 
&lt;td&gt;B:&lt;/td&gt;
 
&lt;td&gt;C:&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;1024&lt;/td&gt;
 
&lt;td&gt;0 ms&lt;/td&gt;
 
&lt;td&gt;0 ms&lt;/td&gt;

&lt;td&gt;0 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;4096&lt;/td&gt;
 
&lt;td&gt;0 ms&lt;/td&gt;
 
&lt;td&gt;0 ms&lt;/td&gt;

&lt;td&gt;0 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;16384&lt;/td&gt;
 
&lt;td&gt;1 ms&lt;/td&gt;
 
&lt;td&gt;1 ms&lt;/td&gt;

&lt;td&gt;1 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;65536&lt;/td&gt;
 
&lt;td&gt;6 ms&lt;/td&gt;
 
&lt;td&gt;5 ms&lt;/td&gt;

&lt;td&gt;5 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;262144&lt;/td&gt;
 
&lt;td&gt;33 ms&lt;/td&gt;
 
&lt;td&gt;&lt;font color="#008000"&gt;28 ms&lt;/font&gt;&lt;/td&gt;

&lt;td&gt;30 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;1048576&lt;/td&gt;
 
&lt;td&gt;&lt;font color="#008000"&gt;503 ms&lt;/font&gt;&lt;/td&gt;
 
&lt;td&gt;578 ms&lt;/td&gt;

&lt;td&gt;507 ms&lt;/td&gt;
&lt;/tr&gt;
 
&lt;tr&gt; 
&lt;td&gt;2097152&lt;/td&gt;
 
&lt;td&gt;1339 ms&lt;/td&gt;
 
&lt;td&gt;1375 ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;1032 ms&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
 
&lt;p&gt;Note that on B and C the algorithm only used one of the two cores. Looks like we need to tweak that a bit, since multi-core CPUs are standard these days.&lt;br /&gt;
&lt;/p&gt;
 &lt;h4&gt;Case 2: Solving a linear equation system&lt;/h4&gt; 
&lt;p&gt;I tested solving a square real&amp;nbsp;linear equation system. Internally the LU decomposition algorithm&amp;nbsp;is used for such square systems. A Size of 1000x1000 means that we solve for 1000 unknowns:&lt;/p&gt;
 
&lt;table&gt;  
&lt;tr&gt; 
&lt;td&gt;Unknowns:&lt;/td&gt;

&lt;td&gt;Matrix Elements:&lt;/td&gt;

&lt;td&gt;A:&lt;/td&gt;

&lt;td&gt;B:&lt;/td&gt;

&lt;td&gt;C:&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;100&lt;/td&gt;

&lt;td&gt;10000&lt;/td&gt;

&lt;td&gt;2&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;2&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;2&amp;nbsp;ms&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;200&lt;/td&gt;

&lt;td&gt;40000&lt;/td&gt;

&lt;td&gt;18&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;18&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;17&amp;nbsp;ms&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;400&lt;/td&gt;

&lt;td&gt;160000&lt;/td&gt;

&lt;td&gt;129&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;129&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;121&amp;nbsp;ms&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;600&lt;/td&gt;

&lt;td&gt;360000&lt;/td&gt;

&lt;td&gt;415&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;418&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;396&amp;nbsp;ms&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;800&lt;/td&gt;

&lt;td&gt;640000&lt;/td&gt;

&lt;td&gt;1056&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;968&amp;nbsp;ms&lt;/font&gt;&lt;/td&gt;

&lt;td&gt;981&amp;nbsp;ms&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt; 
&lt;td&gt;1000&lt;/td&gt;

&lt;td&gt;1000000&lt;/td&gt;

&lt;td&gt;2041&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;1911&amp;nbsp;ms&lt;/td&gt;

&lt;td&gt;&lt;font color="#008000"&gt;1901&amp;nbsp;ms&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
 
&lt;p&gt;Again only one of the two cores on machine B and C was used.&lt;/p&gt;
 &lt;h4&gt;Conclusion&lt;/h4&gt; 
&lt;p&gt;I think the performance is quite acceptable for now. Of course it&amp;#39;s&amp;nbsp;far away from high performance libraries like the Intel MKL (blas, lapack etc. which&amp;nbsp;take advantage of all specialized features of&amp;nbsp;Intel CPUs), but in the end we target another kind of developer/application anyway. &amp;nbsp;If you really want to get all out of your machine, you&amp;#39;ll hardly do that in a managed programming environment like .Net. What we offer instead is a very&amp;nbsp;easy to use infrastructure that is completely managed (no unsafe wrapper), and that runs on any platform that runs .Net (including your PDA) and that is still fast enough for most cases.&lt;br /&gt;
&lt;/p&gt;
 
&lt;p&gt;After all, only 0.006 seconds for a Fourier transform of 65536 samples is not that bad, neither is 0.018 seconds to solve a linear equation system with 200 unknowns.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Update: Added Machine C. The differences between the measured values on A,B and C don&amp;#39;t make much sense, I think I need a better testbed and a larger sample size. Or there are simply other factors that play an important role (e.g. memory alignment -&amp;gt; cache behavior).&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55692" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Forum/default.aspx">Forum</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Interface/default.aspx">Interface</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/FFT/default.aspx">FFT</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Linear+Algebra/default.aspx">Linear Algebra</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Iridium Class Reference</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/04/06/Iridium-Class-Reference.aspx</link><pubDate>Fri, 06 Apr 2007 13:05:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55688</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I&amp;#39;ve finally tried &lt;a href="http://www.sandcastledocs.com/"&gt;Sandcastle&lt;/a&gt; to automatically generate class references from the inline xml comments, as a replacement for the discontinued NDoc. The result for Math.NET Iridium is now available for &lt;a href="http://dev.cdrnet.net/cs/files/folders/mathnet/entry55686.aspx"&gt;download&lt;/a&gt;&amp;nbsp;(in both HtmlHelp &lt;em&gt;CHM&lt;/em&gt; and Ms Help 2 &lt;em&gt;HxS&lt;/em&gt; format). Please note that because NDoc wasn&amp;#39;t working anymore, inline XML documentation wasn&amp;#39;t a top priority for the last years. I didn&amp;#39;t have time to fix it yet, but thought it probably still helps more than none and thus made it available for download. I plan to provide such references for all future Iridium releases and expect its quality to improve clearly in the next release.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55688" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>Yttrium Diagramming</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/03/30/Yttrium-Diagramming.aspx</link><pubDate>Fri, 30 Mar 2007 13:44:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55653</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;There was quite a huge check-in lately on the &lt;a href="http://mathnet.opensourcedotnet.info/"&gt;yttrium&lt;/a&gt; &lt;a href="http://mathnet.opensourcedotnet.info/Repository.aspx"&gt;source code repository&lt;/a&gt;. I&amp;#39;ve been refactoring the yttrium code base to a new microkernel based architecture (motivation: getting rid of cyclic dependencies and the high degree of complexity). The most striking change is the number of assemblies: Instead of a single dll the project is now split in &lt;a href="http://mathnet.opensourcedotnet.info/doc/YttriumModules.ashx"&gt;multiple modules &amp;amp; services&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I&amp;#39;m also working on the diagramming frontend &lt;em&gt;Whiteboard&lt;/em&gt;&amp;nbsp;again. As you may have noticed, &lt;a href="http://www.orbifold.net/default/"&gt;Fran&amp;ccedil;ois&lt;/a&gt; is back working on Diagramming.&amp;nbsp;Although he&amp;#39;s finally moved forward towards WPF/.NET3 with his new &lt;a href="http://www.orbifold.net/unfold/"&gt;Unfold project&lt;/a&gt;, he also released the older GDI+/.NET2 based &lt;a href="http://www.orbifold.net/netron/"&gt;Netron 3&lt;/a&gt; code &lt;a href="http://www.orbifold.net/default/?p=690"&gt;to the public&lt;/a&gt; (GPL; thanks, Fran&amp;ccedil;ois!). I&amp;#39;m currently porting Whiteboard to the newly refactored yttrium codebase and extending the Netron code to better match the yttrium model. It looks great so far, keep in touch. Btw, I also include adjusted shapes for the new &lt;a href="http://mathnet.opensourcedotnet.info/doc/YttriumPetriNetPackage.ashx"&gt;PetriNet demo package&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55653" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Wiki/default.aspx">Wiki</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Repository/default.aspx">Repository</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Yttrium/default.aspx">Yttrium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category></item><item><title>Iridium Release 8: 2007 March (v2007.3.8)</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/03/14/Iridium-Release8-2007-March-v2007-3-8.aspx</link><pubDate>Wed, 14 Mar 2007 21:47:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55606</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I&amp;#39;ve just released a new version of the C# Math.NET Numerics&amp;nbsp;toolkit&amp;nbsp;&lt;strong&gt;Iridium&lt;/strong&gt;, &lt;strong&gt;v2007.3.8&lt;/strong&gt;. Grab it &lt;a href="http://dev.cdrnet.net/cs/files/folders/mathnet/entry55605.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;What&amp;#39;s new in this release? &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Completely revised FFT implementation  &lt;/li&gt;&lt;li&gt;Integration of the Torschutz Random Library, revised and extended with pdf/cdf functions. &lt;/li&gt;&lt;li&gt;Various minor enhancements and fixes&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I allowed myself to include some breaking changes; you&amp;#39;ll have to update your code if you&amp;#39;re working with either FFT transformations or with probability distributions and random generators. Nevertheless, I still recommend to upgrade, as I don&amp;#39;t expect breaking changes in this extent (if any)&amp;nbsp;in the next few releases. &lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55606" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Download/default.aspx">Download</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/FFT/default.aspx">FFT</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Release/default.aspx">Release</category></item><item><title>How to get listed on the great chinese firewall?</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2007/03/08/How-to-get-listed-on-the-great-chinese-firewall_3F00_.aspx</link><pubDate>Thu, 08 Mar 2007 00:06:19 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55598</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;My server is currently being "attacked" by a chinese&amp;nbsp;computer at&amp;nbsp;&lt;strong&gt;220.173.30.198&lt;/strong&gt;, what resolves to - you guessed right - China Telecom:&lt;/p&gt;&lt;pre&gt;netname:      CHINANET-GX
descr:        CHINANET guangxi province network
descr:        China Telecom
descr:        No.31,jingrong street
descr:        Beijing 100032&lt;/pre&gt;
&lt;p&gt;It simply &lt;strike&gt;downloads&lt;/strike&gt; &lt;em&gt;tried to download (until I blocked it on IP protocol level&lt;/em&gt;) some of my open source packages multiple times per second, more than 100'000 times up to now. It's only from one single IP and therefore easy to block, and it generated only about 3 GB extra traffic so far, so it's not really a problem. Most likely&amp;nbsp;a horribly&amp;nbsp;badly written bot ...&lt;/p&gt;
&lt;p&gt;Nevertheless: How to easily get onto the great chinese firewall? What do you have to publish on your server? Would easily prevent both spam and such annoyance... ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why exactly these files?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I already observed something like this maybe a year ago, but expected a download manager then, that was&amp;nbsp;in some way incompatible with the way&amp;nbsp;CommunityServer&amp;nbsp;handles downloads (other than when I'd simply put them directly into an IIS folder).&lt;/p&gt;
&lt;p&gt;What caught my eye was the HTTP Range attribute (is this correct HTTP with the trailing dash?), and the (clearly faked) User-Agent of course. And why does it disallow caches?&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;GET /cs/files/folders/670/download.aspx HTTP/1.1&lt;br&gt;...&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;br&gt;User-Agent: Mozilla/4.0 (compatible; &lt;font color="#ff0000"&gt;MSIE 5.00; Windows 98&lt;/font&gt;)&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Range: bytes=148681-&lt;/font&gt;&lt;/strong&gt;&lt;br&gt;Pragma: &lt;font color="#ff0000"&gt;no-cache&lt;/font&gt;&lt;br&gt;Cache-Control: &lt;font color="#ff0000"&gt;no-cache&lt;/font&gt;&lt;br&gt;Connection: close&lt;/font&gt;
&lt;p&gt;Does CommunityServer maybe have a problem with ranges and download resumes? Is this just a badly written spider/grabber that just hangs there because of some incompatibility? Well, I guess not ...&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55598" width="1" height="1"&gt;</description></item><item><title>Lock down your own .NET Library Assemblies</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2007/03/05/Lock-down-your-own-.NET-Library-Assemblies.aspx</link><pubDate>Mon, 05 Mar 2007 10:35:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55597</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Because information about this is actually hard to find (there are loads of samples around about how to demand several rights, but hardly any about locking down your own frameworks&amp;nbsp;&amp;amp; assemblies):&lt;/p&gt; &lt;p&gt;I recommend for most cases to start from no rights at all&amp;nbsp;(except execution and some identity permissions) and then whitelist whatever you need.&lt;/p&gt; &lt;p&gt;&lt;font color="#800000"&gt;[assembly: &lt;strong&gt;PermissionSet&lt;/strong&gt;(SecurityAction.&lt;strong&gt;RequestOptional&lt;/strong&gt;, Name=&amp;quot;&lt;strong&gt;Execution&lt;/strong&gt;&amp;quot;)]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Note that you have to use RequestOptional, not RequestMinimum (that wouldn&amp;#39;t have any effect! see &lt;a href="http://blogs.msdn.com/shawnfa/archive/2005/09/14/466661.aspx"&gt;here&lt;/a&gt;), because the effective permissions are calculated as follows&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Effective = (RequestMinimum union RequestOptional) - RequestRefuse&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;where by default RequestOptional is FullTrust, Hence you&amp;#39;ll always get FullTrust&amp;nbsp;if you only use RequestMinimum.&lt;/p&gt; &lt;p&gt;Note also that we rely here upon what the user/administrator specified in the &amp;quot;Execution&amp;quot; Permission Set - by default it&amp;#39;s just the SecurityPermission&amp;#39;s Execute Permission and nothing else.&lt;/p&gt; &lt;p&gt;After that just request any additional permissions you may need (&lt;em&gt;RequestOptional&lt;/em&gt;) or you need in any case to make sense (&lt;em&gt;RequestMinimum&lt;/em&gt;), as usual.&amp;nbsp;For example&amp;nbsp;use a FileIOPermission if you need to read some file, or a SocketPermission for network access, with the appropriate SecurityAttribute and parameters:&lt;/p&gt; &lt;p&gt;&lt;font color="#800000"&gt;[assembly: FileIOPermission(SecurityAction.RequestMinimum, ...)]&lt;br /&gt;[assembly: System.Net.SocketPermission(SecurityAction.RequestOptional, ...)]&lt;br /&gt;&lt;/font&gt;...&lt;/p&gt; &lt;p&gt;Earlier I simply used to add &amp;quot;[assembly: SecurityPermission(SecurityAction.RequestRefuse)]&amp;quot; to any of my framework assemblies and thought that&amp;#39;s it, but that was rubbish and didn&amp;#39;t even have any effect. Don&amp;#39;t do it. (Unless I&amp;#39;m very mistaken, please correct me if I am!)&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55597" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Opensource/default.aspx">Opensource</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category></item><item><title>Revised FFT Core for Iridium</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2007/02/28/Revised-FFT-Core-for-Iridium.aspx</link><pubDate>Tue, 27 Feb 2007 23:41:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:55590</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;m currently working on the Iridium (Math.NET Numerics) Fast Fourier Transformation Implementation, to finally fix &lt;a href="http://tracker.opensourcedotnet.info/Default.aspx?p=2&amp;amp;i=33"&gt;known bugs&lt;/a&gt; and&amp;nbsp;improve its usability (make it easier to work with). I expect a new Iridium release this week.&lt;/p&gt; &lt;p&gt;What&amp;#39;s new:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Unit Tests&lt;/strong&gt;: The code base is now tested (including &lt;strong&gt;MATLAB consistency&lt;/strong&gt; and symmetry preservation).&lt;/li&gt; &lt;li&gt;Completely redesigned backend (e.g. removed the previous inheritance scheme).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Better support for real transformations&lt;/strong&gt;. New member design, also for complex transformations.&lt;/li&gt; &lt;li&gt;Optional &lt;strong&gt;Conventions&lt;/strong&gt; parameter. Controls scaling and integrand exponent behavior, e.g. to behave like Maple (symmetric scaling), MATLAB (asymmetric scaling) or Numeric Recipes (asymmetric scaling&amp;nbsp;&amp;amp; inverse exponent sign).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Stateless&lt;/strong&gt;* instead of stateful classes. You don&amp;#39;t have to pass over the data on the constructor anymore, but as method parameters instead.&lt;br /&gt;&lt;em&gt;*except the precomputation cache. However, the classes are not static so you can get rid of the cache if you don&amp;#39;t need it anymore.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The bad news: You&amp;#39;ll have to slightly adapt your code if you work with Iridium&amp;#39;s FFT implementation. However, the code will only become simpler...&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=55590" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/FFT/default.aspx">FFT</category></item><item><title>C++/CLI: Explicitly Implement Interface Properties</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2007/01/09/ExplicitlyImplementInterfaceProperties.aspx</link><pubDate>Tue, 09 Jan 2007 20:37:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:54905</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In case you ever wondered how to explicitly implement interface properties in C++/CLI that collide with an already existing better typed property: It&amp;#39;s quite easy, but I didn&amp;#39;t find a sample in neither the language specification&amp;nbsp;nor the web.&lt;/p&gt; &lt;p&gt;Imagine you have some already existing generic&amp;nbsp;ItemBuilder class:&lt;/p&gt; &lt;div style="border:2px ridge white;margin:10px;padding:10px;font-size:10pt;font-family:courier new;background-color:#eeeeee;"&gt;&lt;font color="blue"&gt;ref&amp;nbsp;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;Item&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;&lt;font color="black"&gt;&lt;font color="blue"&gt;generic&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;/font&gt;&lt;font color="blue"&gt;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;T&amp;gt;&lt;br /&gt;&lt;font color="blue"&gt;where&lt;/font&gt;&amp;nbsp;T&amp;nbsp;:&amp;nbsp;Item&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;public&amp;nbsp;ref&amp;nbsp;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;ItemBuilder&lt;br /&gt;{&lt;br /&gt;&lt;font color="blue"&gt;public&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="blue"&gt;property&lt;/font&gt;&lt;font color="black"&gt;&amp;nbsp;&lt;/font&gt;T&amp;nbsp;Prototype&amp;nbsp;{&amp;nbsp;T&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;get&lt;/font&gt;&lt;font color="black"&gt;()&lt;/font&gt;&lt;font color="blue"&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;/font&gt; &lt;/div&gt; &lt;p&gt;But now you want to generalize it, to be able to access the prototype property as Item, independent of the actual generic class type. So you define an interface IItemBuilder:&lt;/p&gt; &lt;div style="border:2px ridge white;margin:10px;padding:10px;font-size:10pt;font-family:courier new;background-color:#eeeeee;"&gt;&lt;font color="blue"&gt;public&amp;nbsp;interface&amp;nbsp;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;IItemBuilder&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="blue"&gt;property&lt;/font&gt;&lt;font color="black"&gt;&amp;nbsp;&lt;/font&gt;Item^&amp;nbsp;Prototype&amp;nbsp;{&amp;nbsp;Item^&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;get&lt;/font&gt;&lt;font color="black"&gt;()&lt;/font&gt;&lt;font color="blue"&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;/font&gt; &lt;/div&gt; &lt;p&gt;How to explicitly implement this interface in ItemBuilder in C++/CLI?&lt;/p&gt; &lt;div style="border:2px ridge white;margin:10px;padding:10px;font-size:10pt;font-family:courier new;background-color:#eeeeee;"&gt;&lt;font color="black"&gt;&lt;font color="blue"&gt;generic&lt;/font&gt;&amp;lt;&lt;/font&gt;&lt;font color="blue"&gt;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;T&amp;gt;&lt;br /&gt;&lt;font color="blue"&gt;where&lt;/font&gt;&amp;nbsp;T&amp;nbsp;:&amp;nbsp;Item&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;public&amp;nbsp;ref&amp;nbsp;class&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;ItemBuilder&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;public&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;IPacketBuilder&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;private&lt;/font&gt;&lt;font color="black"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;virtual property&lt;/font&gt;&lt;font color="black"&gt;&amp;nbsp;Item^&amp;nbsp;PrototypeUntyped&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;Item^&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;get&lt;/font&gt;&lt;font color="black"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;sealed&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;IItemBuilder::Prototype::&lt;/font&gt;&lt;font color="blue"&gt;get;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;public&lt;/font&gt;&lt;font color="black"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="blue"&gt;property&lt;/font&gt;&lt;font color="black"&gt;&amp;nbsp;&lt;/font&gt;T&amp;nbsp;Prototype&amp;nbsp;{&amp;nbsp;T&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;get&lt;/font&gt;&lt;font color="black"&gt;()&lt;/font&gt;&lt;font color="blue"&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;}&lt;/font&gt;&lt;font color="blue"&gt;;&amp;nbsp;&lt;/font&gt; &lt;/div&gt; &lt;p&gt;Let me know if you know a better approach ...&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=54905" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Bits+and+Bytes/default.aspx">Bits and Bytes</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category></item><item><title>Strange PowerShell Bug?</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2006/09/24/StrangePowerShellBug.aspx</link><pubDate>Sun, 24 Sep 2006 19:19:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:4458</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I&amp;#39;m fighting with a strange behavior of the MS &lt;strong&gt;PowerShell RC1&lt;/strong&gt;, that might be a &lt;strong&gt;bug&lt;/strong&gt;. It&amp;#39;s about moving and renaming items with &amp;quot;[&amp;quot; or &amp;quot;]&amp;quot; in the name. Strangely they&amp;#39;re simply ignored, sometimes I also get a message that the file does not exist (although I just gathered it using Get-ChildItem!?)&lt;/p&gt; &lt;p&gt;How to reproduce:  &lt;/p&gt;&lt;p&gt;Open PowerShell and create an empty directory:&lt;/p&gt; &lt;p&gt;&amp;gt; mkdir pstest&lt;br /&gt;&amp;gt; cd pstest&lt;/p&gt; &lt;p&gt;Create a file without [ and ] and rename/move it around.&lt;/p&gt; &lt;p&gt;&amp;gt; New-Item abc.txt -type file&lt;br /&gt;&amp;gt; gci *.txt | mi -Destination test.txt // &lt;font color="#008000"&gt;&lt;strong&gt;works&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&amp;gt; ri test.txt  &lt;/p&gt;&lt;p&gt;Now try it with a file containing [ and ] in its name. &lt;/p&gt;&lt;p&gt;&amp;gt; New-Item abc.[def].txt -type file&lt;br /&gt;&amp;gt; gci *.txt | mi -Destination test.txt // &lt;font color="#ff0000"&gt;&lt;strong&gt;does NOT work&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;In the second case the file is not renamed. Did I misunderstand something? Can you reproduce it? It is an old well known bug?&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=4458" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Bug/default.aspx">Bug</category></item><item><title>PowerShell for Math.NET</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2006/09/23/PowerShell-for-Math.NET.aspx</link><pubDate>Sat, 23 Sep 2006 10:40:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:4303</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I think it would be really interesting to propagate the new MS PowerShell as a new interface for Math.NET, especially for the Yttrium project. Yttrium already provides very simple script support, but PowerShell has so much more to offer. I think about writing some PowerShell cmdlets and functions, and maybe a provider for yttrium systems, and make this the foundation of any future interactive interfaces.&lt;/p&gt; &lt;p&gt;Let me know what you think about this approach!&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=4303" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Yttrium/default.aspx">Yttrium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Scripting/default.aspx">Scripting</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Interface/default.aspx">Interface</category></item><item><title>Email Address Format Myths</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2006/09/16/Email-Address-Format-Myths.aspx</link><pubDate>Sat, 16 Sep 2006 14:58:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:3531</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;I&amp;#39;m used to&amp;nbsp;enter a unique email address&amp;nbsp;whenever I really have to provide one. Up to some weeks ago I used the &amp;quot;reg.{0}@mydomain.com&amp;quot; pattern, where I replaced &amp;quot;{0}&amp;quot; with a name I associate with the site, often the second level domain part (e.g. &amp;quot;amazon&amp;quot;). I applied a set of server side processing rules to&amp;nbsp;move some of them to special folders, and automatically delete mails to blacklisted names. This worked very well for the last, say, 7-8 years. More than once I observed that a name I used to register for a once&amp;nbsp;free service was obviously sold to spammers some months after the service was discontinued, so I just blacklisted this name.&lt;/p&gt; &lt;p&gt;I can do this because I have my own domain and mail server, and I&amp;#39;ve set a catch-all alias. Unfortunately I receive a lot of spam to obviously random generated email aliases (like &amp;quot;abnd798as8fihkasd89@...&amp;quot;), so I finally decided to upgrade my mail server to SmarterMail 3, which not only provides a much better spam filter system, but also allows the so called &lt;strong&gt;plus-addressing&lt;/strong&gt;, allowing the same thing (the format is now &amp;quot;reg+{0}@mydomain.com&amp;quot;, and it automatically moves mails to a {0}-folder (optional: always, only if folder already exists, never)) but without the hassle of&amp;nbsp;a catch-all alias.&lt;/p&gt; &lt;p&gt;At the beginning this worked very well. But soon I got problems because some web apps don&amp;#39;t allow the &amp;quot;+&amp;quot;-character in email addresses. This is strange, since a &amp;quot;+&amp;quot; in the local part (that is the part before the &amp;quot;@&amp;quot;) perfectly legal.&lt;/p&gt; &lt;p&gt;Obviously there exists some strange myths about what characters are allowed in an email address or not. I suspect the reason for some of this myths is that the rules for domain names are very restrictive -&amp;nbsp;domain names indeed don&amp;#39;t allow &amp;quot;+&amp;quot;-characters. But the local-part does, and much more. I&amp;#39;ve also heard myth saying that everything after a &amp;quot;+&amp;quot; is considered as a comment. Or that &amp;quot;+&amp;quot; is considered equal to &amp;quot;@&amp;quot; in case you can&amp;#39;t enter a real&amp;nbsp;&amp;quot;@&amp;quot; for whatever reason. Btw, GMail supports Plus-Addressing (no, they did not invent it!), but the part after the &amp;quot;+&amp;quot; is apparently limited to six characters (I haven&amp;#39;t tested that).&lt;/p&gt; &lt;p&gt;According to &lt;a href="http://tools.ietf.org/html/rfc2821"&gt;RFC2821&lt;/a&gt; (SMTP)&amp;nbsp;and &lt;a href="http://tools.ietf.org/html/rfc2822"&gt;RFC2822&lt;/a&gt; (Internet Message Format), a mailbox address is constructed as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Mailbox = Local-part &amp;quot;@&amp;quot; Domain  &lt;/li&gt;&lt;li&gt;Local-part = Dot-string / Quoted-string  &lt;/li&gt;&lt;li&gt;Dot-string = Atom *(&amp;quot;.&amp;quot; Atom)  &lt;/li&gt;&lt;li&gt;Atom = 1*atext  &lt;/li&gt;&lt;li&gt;atext = ALPHA / DIGIT / &amp;quot;!&amp;quot; / &amp;quot;#&amp;quot; / &amp;quot;$&amp;quot; / &amp;quot;%&amp;quot; / &amp;quot;&amp;amp;&amp;quot; / &amp;quot;&amp;#39;&amp;quot; / &amp;quot;*&amp;quot; / &amp;quot;+&amp;quot; / &amp;quot;-&amp;quot; / &amp;quot;/&amp;quot; / &amp;quot;=&amp;quot; / &amp;quot;?&amp;quot; / &amp;quot;^&amp;quot; / &amp;quot;_&amp;quot; / &amp;quot;`&amp;quot; / &amp;quot;{&amp;quot; / &amp;quot;|&amp;quot; / &amp;quot;}&amp;quot; / &amp;quot;~&amp;quot;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;To summarize, the local part (before @)&amp;nbsp;allows the following characters:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;br /&gt;abcdefghijklmnopqrstuvwxyz&lt;br /&gt;0123456789&lt;br /&gt;&lt;font color="#ff0000"&gt;.!#$%&amp;amp;&amp;quot;*+-/=?^_`{|}~&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;While the domain part (after @) only allows the following characters (except &lt;a href="http://en.wikipedia.org/wiki/Internationalized_domain_name"&gt;IDN&lt;/a&gt;, but that&amp;#39;s another topic):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;br /&gt;abcdefghijklmnopqrstuvwxyz&lt;br /&gt;0123456789&lt;br /&gt;.-&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Note that domain names are never case-sensitive, but the local-part might be (allowed, but optional).&lt;/p&gt; &lt;p&gt;Beside of the next best web-app I&amp;#39;ve also heard of some MTAs making problems with local-parts that aren&amp;#39;t valid domain names.&amp;nbsp;Why on earth do developers still validate the whole email address with the domain name rules? Just for simplicity? Please, don&amp;#39;t do that, or I&amp;#39;ll have to put your name to the &amp;quot;&lt;a href="http://mozilla.wikia.com/wiki/User:Me_at_work/plushaters"&gt;plus-haters list of shame&lt;/a&gt;&amp;quot; ;)&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=3531" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Networking/default.aspx">Networking</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Formal+Languages/default.aspx">Formal Languages</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Rant/default.aspx">Rant</category></item><item><title>Agile Hardware Design?</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2006/08/25/Agile-Hardware-Design.aspx</link><pubDate>Fri, 25 Aug 2006 20:43:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:1506</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Looking back at my first semester thesis at &lt;a href="http://www.ethz.ch/"&gt;ETH&lt;/a&gt;, where I &lt;a href="http://dev.cdrnet.net/cs/blogs/computer/archive/2006/05/04/FirstAsic.aspx"&gt;designed a full-custom ASIC&lt;/a&gt;, I realize something odd:&lt;/p&gt; &lt;p&gt;In VLSI design, especially when designing ASICs or ASIPs (not so much on FPGAs), people make a real fuss about &lt;strong&gt;testing&lt;/strong&gt;. For a good reason, since &lt;font color="#0080ff"&gt;A)&lt;/font&gt; the fabrication setup is expensive and really slow (you speak in&amp;nbsp;terms of months), and even more important, since &lt;font color="#0080ff"&gt;B)&lt;/font&gt; the fabrication is error-prone. As a side note,&amp;nbsp;in practice it is not economic to fabricate error-free, as such a process&amp;nbsp;would be&amp;nbsp;clearly far from the density limit. Hence you usually accept a yield of, say, Y=95%. Having a fault coverage T leads to a defect level of DF = 1-Y^(1-T). To minimize this you want a high fault coverage (e.g. T &amp;gt; 99.9%).&lt;/p&gt; &lt;p&gt;Part &lt;font color="#0080ff"&gt;A)&lt;/font&gt; is about &lt;strong&gt;functional tests&lt;/strong&gt; to ensure the IC does what you intend, while &lt;font color="#0080ff"&gt;B)&lt;/font&gt; is about testing whether the chip fabric actually produced error-free what you told them to - you examine every single IC with this test, often directly on the waver.&lt;/p&gt; &lt;p&gt;Interestingly there is a very nice tool support for &lt;font color="#0080ff"&gt;B)&lt;/font&gt;. A common practice are &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Scan_chain"&gt;scan chains&lt;/a&gt;&lt;/strong&gt;,&amp;nbsp;a simple technique&amp;nbsp;where you&amp;nbsp;insert additional logic to systematically set the values of every single register on the chip with only few additional I/O pads&amp;nbsp;(actually,&amp;nbsp;a tool inserts this automatically). Using such chains and a&amp;nbsp;given fault model, another tool then &lt;a href="http://en.wikipedia.org/wiki/ATPG"&gt;automatically generates a huge set of test vectors&lt;/a&gt;, trying to reach 100% fault coverage with as few vectors as possible.&lt;/p&gt; &lt;p&gt;Now the odd part, when we come to &lt;font color="#0080ff"&gt;A)&lt;/font&gt;: No one seems to apply &lt;strong&gt;Unit Testing&lt;/strong&gt;, or has ever heard of anything like &amp;quot;agile&amp;quot; methodologies. Ok, they do functional testing, but only the on whole chip (and to be fair, also on IP blocks - usually this means generating an input vector sequence and compare the simulated outputs with the expectations); and it probably depends on the environment. But I think there doesn&amp;#39;t even exist a tool like NUnit/JUnit for VHDL, let alone a continuous integration server (although you could theoretically write&amp;nbsp;some NAnt task adapters and use a common CI server). Looks like there&amp;#39;s not that much communication between the hardware and the software world, or at least not on methodological aspects?&lt;/p&gt;&lt;p&gt;Btw, there is a ruby based hardware description language called &lt;a href="http://www.aracnet.com/~ptkwt/ruby_stuff/RHDL/"&gt;RHDL&lt;/a&gt;, trying to unify object oriented and agile concepts with VHDL. Might be interesting!&lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=1506" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/ASIC/default.aspx">ASIC</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Thesis/default.aspx">Thesis</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Hardware/default.aspx">Hardware</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Agile/default.aspx">Agile</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/VHDL/default.aspx">VHDL</category></item><item><title>Kakuro Combinations</title><link>http://community.opensourcedotnet.info/blogs/computer/archive/2006/08/23/Kakuro-Combinations.aspx</link><pubDate>Wed, 23 Aug 2006 19:26:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:1267</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Enough&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Sudoku"&gt;Sudoku&lt;/a&gt;&amp;nbsp;for a while? Try &lt;a href="http://en.wikipedia.org/wiki/Kakuro"&gt;Kakuro&lt;/a&gt;!&lt;/p&gt;
 
&lt;p&gt;I&amp;#39;ve created a small helper table lately, listing what numbers are possible in what condition (dependent on the required sum and the number of fields). You may download it as a PDF (see attachment):&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;img height="227" src="http://dev.cdrnet.net/webfiles/4e0fdbe71745_F562/Kakuro12.png" width="418" /&gt; &lt;/p&gt;
 
&lt;p&gt;I could have evaluated the allowed numbers by hand, but decided to write a small console code snippet in C# instead. It&amp;#39;s neither optimized nor well designed, but it works... *note to myself: use a functional language next time*&lt;/p&gt;
 
&lt;p&gt;Call the method Kakuro(s,f) with the required sum in &lt;strong&gt;s&lt;/strong&gt; and the number of fields in &lt;strong&gt;f&lt;/strong&gt;, and it returns all possible combinations (only&amp;nbsp;the ascending&amp;nbsp;permutation for each)&amp;nbsp;and the union set of numbers appearing in at least one combination (that&amp;#39;s the numbers in the helper table above)&lt;/p&gt;
 
&lt;p&gt;The recursive backtracking method (with inline console output for simplicity):&lt;/p&gt;

&lt;pre&gt;static BitArray AppendSummand(int summandsLeft, int targetSum, BitArray used, int sum, int nextSummand)&lt;br /&gt;{
&amp;nbsp;&amp;nbsp; if(summandsLeft == 0)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(targetSum == sum)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;// found valid solution
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintUsed(used, false);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return used;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else // invalid solution A
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new BitArray(9);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; if(nextSummand &amp;gt;= 10) // invalid solution B
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return new BitArray(9);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp; BitArray usedWith = new BitArray(used);
&amp;nbsp;&amp;nbsp; usedWith[nextSummand-1] = true; // try with this number
&amp;nbsp;&amp;nbsp; BitArray resultWithout = AppendSummand(summandsLeft, targetSum, used, sum, nextSummand+1);
&amp;nbsp;&amp;nbsp; BitArray resultWith = AppendSummand(summandsLeft-1, targetSum, usedWith, sum+nextSummand, nextSummand+1);
&amp;nbsp;&amp;nbsp; // combine results for the summary
&amp;nbsp;&amp;nbsp; return resultWithout.Or(resultWith);
}&lt;/pre&gt;

&lt;p&gt;And the method to run it:&lt;/p&gt;

&lt;pre&gt;static void Kakuro(int sum, int fields)
{
&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;==================================&amp;quot;);
&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;** Sum {0} in {1} cells&amp;quot;,sum,fields);
&amp;nbsp;&amp;nbsp; BitArray used = new BitArray(9);
&amp;nbsp;&amp;nbsp; BitArray res = AppendSummand(fields,sum,used,0,1);
&amp;nbsp;&amp;nbsp; Console.Write(&amp;quot;** Superset: &amp;quot;);
&amp;nbsp;&amp;nbsp; PrintUsed(res, true);
&amp;nbsp;&amp;nbsp; Console.WriteLine();
}&lt;br /&gt;
&lt;/pre&gt;

&lt;p&gt;Finally the print method used to print the numbers to the console:&lt;/p&gt;

&lt;pre&gt;static void PrintUsed(BitArray used, bool all)
{
&amp;nbsp;&amp;nbsp; Console.ForegroundColor = ConsoleColor.Green;
&amp;nbsp;&amp;nbsp; if(all)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;used.Length;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ForegroundColor = used[ i ] ? ConsoleColor.Green : ConsoleColor.Red;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write((i+1).ToString() + &amp;quot; &amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;used.Length;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(used[ i ])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write((i+1).ToString() + &amp;quot; &amp;quot;);
&amp;nbsp;&amp;nbsp; Console.ResetColor();
&amp;nbsp;&amp;nbsp; Console.WriteLine();
}&lt;br /&gt;
&lt;/pre&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=1267" width="1" height="1"&gt;</description><enclosure url="http://community.opensourcedotnet.info/blogs/computer/attachment/1267.ashx" length="39067" type="application/pdf" /><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Games/default.aspx">Games</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Algorithms/default.aspx">Algorithms</category><category domain="http://community.opensourcedotnet.info/blogs/computer/archive/tags/Software/default.aspx">Software</category></item><item><title>Handling Floating Point Numbers</title><link>http://community.opensourcedotnet.info/blogs/mathnet_en/archive/2006/08/16/Handling-Floating-Point-Numbers.aspx</link><pubDate>Wed, 16 Aug 2006 21:23:00 GMT</pubDate><guid isPermaLink="false">5e0c48d9-3477-4155-b28a-6cca64e53d2a:1166</guid><dc:creator>Christoph Rüegg</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Did you know, that:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;a double can represent 0xFF&lt;strong&gt;&lt;font color="#ff0000"&gt;D&lt;/font&gt;&lt;/strong&gt;FFFFFFFFFFFFF = 18437736874454810623 distinct numbers?  &lt;/li&gt;&lt;li&gt;there are 450359962736 doubles between 1.0001 and 1.0002?  &lt;/li&gt;&lt;li&gt;54975581 between 10&amp;#39;000.0001 and 10&amp;#39;000.0002?  &lt;/li&gt;&lt;li&gt;52 between 10&amp;#39;000&amp;#39;000&amp;#39;000.0001 and&amp;nbsp;10&amp;#39;000&amp;#39;000&amp;#39;000.0002?  &lt;/li&gt;&lt;li&gt;the smallest difference between neighbor numbers is 4.941E&lt;strong&gt;&lt;font color="#ff0000"&gt;-&lt;/font&gt;&lt;/strong&gt;324 for 0, and the biggest difference 1.996E&lt;strong&gt;&lt;font color="#ff0000"&gt;+&lt;/font&gt;&lt;/strong&gt;292 for double.MaxValue?  &lt;/li&gt;&lt;li&gt;the difference between 1.0 and the&amp;nbsp;biggest number&amp;nbsp;smaller than 1.0 is 1.110E-16&lt;br /&gt;(this value is often called negative epsilon (*2 = the (positive) epsilon)&amp;nbsp;, &lt;strong&gt;but not in .Net!&lt;/strong&gt; In the framework, double.Epsilon&amp;nbsp;is defined as&amp;nbsp;4.941E-324, the number from above!)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;It&amp;#39;s common knowledge that floating point numbers are somewhat tricky to work with,&amp;nbsp;especially if rounding-off errors and exact values become important. Although this is (hopefully) discussed in any computer science and engineering study course, there&amp;nbsp;has been&amp;nbsp;quite some blogging about it lately:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://wesnerm.blogs.com/net_undocumented/2006/08/floatingpointin.html"&gt;Floating-Point Numbers&lt;/a&gt;&amp;nbsp;(Wesner Moise)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://wesnerm.blogs.com/net_undocumented/2006/06/999_1.html"&gt;.999... = 1&lt;/a&gt; (Wesner Moise)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.regdeveloper.co.uk/2006/08/12/floating_point_approximation/"&gt;The trouble with rounding floating point numbers&lt;/a&gt; (Dan Clarke)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/kathykam/archive/2006/05/08/592888.aspx"&gt;Quiz of the Month: Double Trouble&lt;/a&gt; (Kathy Kam)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/WhyYouCantDoubleParseDoubleMaxValueToStringOrSystemOverloadExceptionsWhenUsingDoubleParse.aspx"&gt;Why you can&amp;#39;t Double.Parse(double.MaxValue.ToStr...&lt;/a&gt; (Scott Hanselman)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://wesnerm.blogs.com/net_undocumented/2005/01/floating_point_.html"&gt;Floating Point Arithmetic&lt;/a&gt; (Wesner Moise)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://wesnerm.blogs.com/net_undocumented/2005/01/numbers_in_net.html"&gt;Numbers in .NET&lt;/a&gt; (Wesner Moise)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.yoda.arachsys.com/csharp/floatingpoint.html"&gt;Binary floating point and .NET&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm"&gt;&lt;strong&gt;Comparing floating point numbers&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; (Bruce Dawson)&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.physics.ohio-state.edu/~dws/grouplinks/floating_point_math.pdf"&gt;&amp;quot;What Every Computer Scientist Should Know About Floating-Point Arithmetic&amp;quot;&lt;/a&gt; (PDF)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;One of the conclusions is that &lt;strong&gt;it&amp;#39;s dangerous to compare floating point numbers directly&lt;/strong&gt;. Of course this is a problem in Math.NET Iridium, so I tried to add some helper functions to Iridium for handling double numbers. You&amp;#39;ll find them in the new static&amp;nbsp;&lt;em&gt;Number&lt;/em&gt; class directly in the &lt;em&gt;MathNet.Numerics&lt;/em&gt; namespace. The most important function, AlmostEquals, is inspired by Bruce Dawson&amp;#39;s article (see above). They&amp;#39;re propositions, so please let me know if you&amp;nbsp;think they&amp;#39;re flawed...&lt;/p&gt; &lt;h1&gt;Integer Representation of Doubles&lt;/h1&gt; &lt;p&gt;In order to work with doubles in an exact way, we have to treat them as integers. We can convert them either by doing some unsafe pointer casting, by emulating a union (&lt;em&gt;StructLayout&lt;/em&gt; and &lt;em&gt;FieldOffset&lt;/em&gt; attributes), or simply by using the &lt;em&gt;BitConverter&lt;/em&gt; (which uses the first pointer approach internally; System.Runtime.InteropServices namespace).&lt;/p&gt; &lt;p&gt;Unfortunately, floating point numbers&amp;nbsp;are&amp;nbsp;stored as&amp;nbsp;&lt;em&gt;signed magnitudes&lt;/em&gt;, while integers use the &lt;em&gt;two&amp;#39;s complement&lt;/em&gt; to&amp;nbsp;represent negative numbers.&amp;nbsp;We thus have to convert negative numbers if we need&amp;nbsp;them&amp;nbsp;to be&amp;nbsp;lexicographically ordered (such that the distance from 0 to 1 equals to the distance from -1 to 0, and that -0&amp;nbsp;=&amp;nbsp;+0):&lt;/p&gt;&lt;pre&gt;public static long SignedMagnitudeToTwosComplementInt64(long value)&lt;br /&gt;{&lt;br /&gt;  return (value &amp;gt;= 0) ? value : (long)(0x8000000000000000 - (ulong)value);&lt;br /&gt;}&lt;/pre&gt;&lt;pre&gt;public static ulong ToLexicographicalOrderedUInt64(double value)&lt;br /&gt;{&lt;br /&gt;  long signed64 = BitConverter.DoubleToInt64Bits(value);&lt;br /&gt;  ulong unsigned64 = (ulong)signed64;&lt;br /&gt;  return (signed64 &amp;gt;= 0) ? unsigned64 : 0x8000000000000000 - unsigned64;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;The expected behavior (excerpt from the unit tests):&lt;/p&gt;&lt;pre&gt;ToLexicographicalOrderedUInt64(2 * double.Epsilon) == 2&lt;br /&gt;ToLexicographicalOrderedUInt64(1 * double.Epsilon) == 1&lt;br /&gt;ToLexicographicalOrderedUInt64(0.0) == 0&lt;br /&gt;ToLexicographicalOrderedUInt64(-1 * double.Epsilon) == 0xFFFFFFFFFFFFFFFF&lt;br /&gt;&lt;br /&gt;SignedMagnitudeToTwosComplementInt64(1) == 1&lt;br /&gt;SignedMagnitudeToTwosComplementInt64(0) == 0&lt;br /&gt;SignedMagnitudeToTwosComplementInt64(-9223372036854775808) == 0&lt;br /&gt;SignedMagnitudeToTwosComplementInt64(-9223372036854775808 + 1) == -1&lt;/pre&gt;
&lt;h1&gt;Incrementing Doubles&lt;/h1&gt;
&lt;p&gt;Thanks to this two&amp;#39;s complement integer representation we immediately have the power to increment or decrement floating point numbers, and iterate through all numbers&amp;nbsp;a double can represent&amp;nbsp;in a given range:&lt;/p&gt;&lt;pre&gt;public static double Increment(double value)&lt;br /&gt;{&lt;br /&gt;  if(double.IsInfinity(value) || double.IsNaN(value))&lt;br /&gt;    return value;&lt;br /&gt;&lt;br /&gt;  long signed64 = BitConverter.DoubleToInt64Bits(value);&lt;br /&gt;  if(signed64 &amp;lt; 0)&lt;br /&gt;    signed64--;&lt;br /&gt;  else&lt;br /&gt;    signed64++;&lt;br /&gt;  if(signed64 == -9223372036854775808) // = &amp;quot;-0&amp;quot;, make it &amp;quot;+0&amp;quot;&lt;br /&gt;    return 0;&lt;br /&gt;&lt;br /&gt;  value = BitConverter.Int64BitsToDouble(signed64);&lt;br /&gt;  return double.IsNaN(value) ? double.NaN : value;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Again an excerpt of the expected behavior:&lt;/p&gt;&lt;pre&gt;double x = double.Epsilon;&lt;br /&gt;x = Decrement(x);&lt;br /&gt;--&amp;gt; x == 0&lt;br /&gt;x = Decrement(x);&lt;br /&gt;--&amp;gt; x == -double.Epsilon&lt;br /&gt;x = Increment(x);&lt;br /&gt;--&amp;gt; x == 0&lt;br /&gt;x = Increment(x);&lt;br /&gt;x = Increment(x);&lt;br /&gt;--&amp;gt; x == 2 * double.Epsilon&lt;br /&gt;x = double.MaxValue;&lt;br /&gt;x = Decrement(x);&lt;br /&gt;--&amp;gt; x &amp;lt; double.MaxValue&lt;br /&gt;x = Increment(x);&lt;br /&gt;--&amp;gt; x == double.MaxValue&lt;/pre&gt;
&lt;h1&gt;Evaluating the Precision: Epsilon&lt;/h1&gt;
&lt;p&gt;The incrementation step depends on the exponent, so it may differ between different numbers. It is important for example in iterative approximation algorithms to know when to stop. The following function returns the decrementation step near a given number, often referred to as a scaled negative epsilon:&lt;/p&gt;&lt;pre&gt;public static double EpsilonOf(double value)&lt;br /&gt;{&lt;br /&gt;  if(double.IsInfinity(value) || double.IsNaN(value))&lt;br /&gt;   return double.NaN;&lt;br /&gt;&lt;br /&gt;  long signed64 = BitConverter.DoubleToInt64Bits(value);&lt;br /&gt;  if(signed64 == 0)&lt;br /&gt;  {&lt;br /&gt;    signed64++;&lt;br /&gt;    return BitConverter.Int64BitsToDouble(signed64) - value;&lt;br /&gt;  }&lt;br /&gt;  else if(signed64-- &amp;lt; 0)&lt;br /&gt;    return BitConverter.Int64BitsToDouble(signed64) - value;&lt;br /&gt;  else&lt;br /&gt;    return value - BitConverter.Int64BitsToDouble(signed64);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;And some examples:&lt;/p&gt;&lt;pre&gt;EpsilonOf(1.0).ToString() == &amp;quot;1.11022302462516E-16&amp;quot;&lt;br /&gt;EpsilonOf(0.0).ToString() == &amp;quot;4.94065645841247E-324&amp;quot;&lt;br /&gt;EpsilonOf(-1.0e+100).ToString() == &amp;quot;1.94266889222573E+84&amp;quot;&lt;br /&gt;EpsilonOf(1.0e-100).ToString() == &amp;quot;1.26897091865782E-116&amp;quot;&lt;br /&gt;EpsilonOf(double.MinValue).ToString() == &amp;quot;1.99584030953472E+292&amp;quot; &lt;/pre&gt;
&lt;h1&gt;Numbers between two doubles&lt;/h1&gt;
&lt;p&gt;It may be interesting to know how many numbers can be represented by a double variable, which are all between two given numbers. Using the methods introduced above this is simple:&lt;/p&gt;&lt;pre&gt;public static ulong NumbersBetween(double a, double b)&lt;br /&gt;{&lt;br /&gt;  // left out (see repository): handling NaN and Infinity &lt;br /&gt;&lt;br /&gt;  ulong ua = ToLexicographicalOrderedUInt64(a);&lt;br /&gt;&amp;nbsp; ulong ub = ToLexicographicalOrderedUInt64(b);&lt;br /&gt;&lt;br /&gt;  return (a &amp;gt;= b) ? ua - ub : ub - ua;&lt;br /&gt;} &lt;/pre&gt;
&lt;p&gt;Examples:&lt;/p&gt;&lt;pre&gt;NumbersBetween(1.0, 1.0) == 0&lt;br /&gt;NumbersBetween(0, double.Epsilon) == 1&lt;br /&gt;NumbersBetween(-double.Epsilon, 2 * double.Epsilon) == 3&lt;br /&gt;double test = Math.PI * 1e+150;&lt;br /&gt;NumbersBetween(test, test + 10 * Number.EpsilonOf(test) == 10&lt;br /&gt;NumbersBetween(1.0001, 1.0002) == 450359962737&lt;br /&gt;NumbersBetween(10000000000.0001, 10000000000.0002) == 53&lt;br /&gt;NumbersBetween(double.MinValue, double.MaxValue) == 18437736874454810622&lt;/pre&gt;
&lt;h1&gt;Compare doubles for (almost) equality&lt;/h1&gt;
&lt;p&gt;Now we come to the final but most important method, for a safe and more sensible way of comparing two floating point numbers for almost equality. Call this method with two doubles and a parameter specifying how many numbers may be between the two numbers at most (+1):&lt;/p&gt;&lt;pre&gt;public static bool AlmostEqual(double a, double b, int maxNumbersBetween)&lt;br /&gt;{&lt;br /&gt;  // left out (see repository): argument checks&lt;br /&gt;&lt;br /&gt;  // NaN&amp;#39;s should never equal to anything&lt;br /&gt;  if(double.IsNaN(a) || double.IsNaN(b)) //(a != a || b != b)&lt;br /&gt;    return false;&lt;br /&gt;  if(a == b)&lt;br /&gt;    return true;&lt;br /&gt;&lt;br /&gt;  // false, if only one of them is infinity or they differ on the infinity sign&lt;br /&gt;  if(double.IsInfinity(a) || double.IsInfinity(b))&lt;br /&gt;    return false;&lt;br /&gt;&lt;br /&gt;  ulong between = NumbersBetween(a, b);&lt;br /&gt;  return between &amp;lt;= (uint)maxNumbersBetween;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Examples:&lt;/p&gt;&lt;pre&gt;Convert.ToDouble(&amp;quot;3.170404&amp;quot;) == 3.170404 --&amp;gt; TRUE&lt;br /&gt;Convert.ToDouble(&amp;quot;4.170404&amp;quot;) == 4.170404 --&amp;gt; FALSE&lt;br /&gt;Number.AlmostEqual(Convert.ToDouble(&amp;quot;3.170404&amp;quot;), 3.170404, 0) --&amp;gt; TRUE&lt;br /&gt;Number.AlmostEqual(Convert.ToDouble(&amp;quot;4.170404&amp;quot;), 4.170404, 0) --&amp;gt; FALSE&lt;br /&gt;Number.AlmostEqual(Convert.ToDouble(&amp;quot;4.170404&amp;quot;), 4.170404, 1) --&amp;gt; TRUE&lt;br /&gt;Number.AlmostEqual(0.0, 0.0 + double.Epsilon, 0) --&amp;gt; FALSE&lt;br /&gt;Number.AlmostEqual(0.0, 0.0 + double.Epsilon, 1) --&amp;gt; TRUE&lt;br /&gt;double max = double.MaxValue;&lt;br /&gt;Number.AlmostEqual(max, max - 2 * Number.EpsilonOf(max), 0) --&amp;gt; FALSE&lt;br /&gt;Number.AlmostEqual(max, max - 2 * Number.EpsilonOf(max), 1) --&amp;gt; FALSE&lt;br /&gt;Number.AlmostEqual(max, max - 2 * Number.EpsilonOf(max), 2) --&amp;gt; TRUE&lt;/pre&gt;&lt;img src="http://community.opensourcedotnet.info/aggbug.aspx?PostID=1166" width="1" height="1"&gt;</description><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Iridium/default.aspx">Iridium</category><category domain="http://community.opensourcedotnet.info/blogs/mathnet_en/archive/tags/Math.NET/default.aspx">Math.NET</category></item></channel></rss>