{"id":105,"date":"2020-07-07T19:48:58","date_gmt":"2020-07-07T19:48:58","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=105"},"modified":"2020-07-09T20:56:53","modified_gmt":"2020-07-09T20:56:53","slug":"entropygeneric-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/07\/07\/entropygeneric-cs\/","title":{"rendered":"EntropyGeneric.cs"},"content":{"rendered":"\n<p>Detect Entropy Levels from Primitive Data Arrays<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\npublic class EntropyGeneric&lt;T>\n{\n    private const    double             NaturalLogOfTwo = 0.69314718055994530941723212145818;\n    private readonly Dictionary&lt;T, int> _hist           = new Dictionary&lt;T, int>();\n    private          bool               _mapStatus;\n    public EntropyGeneric()\n    {\n        _hist.Clear();\n        _mapStatus = false;\n    }\n    public (double entropy, int perfect) Entropy(T[] s)\n    {\n        if (_mapStatus)\n        {\n            _hist.Clear();\n            _mapStatus = false;\n        }\n        foreach (var c in s)\n            if (!_hist.ContainsKey(c))\n                _hist.Add(c, 1);\n            else\n                _hist[c] += 1;\n        _mapStatus = true;\n        var e = 0.0;\n        foreach (var v in _hist.Values)\n        {\n            if (v &lt;= 0)\n                continue;\n            var r = v             \/ (double) s.Length;\n            e -= r * (Math.Log(r) \/ NaturalLogOfTwo);\n        }\n        return (e, GetSize());\n    }\n    private byte[] ConvertTypeByteArray(T[] ia)\n    {\n        switch (Type.GetTypeCode(typeof(T)))\n        {\n            case TypeCode.Boolean:\n                break;\n            case TypeCode.Char:\n                break;\n            case TypeCode.SByte:\n                break;\n            case TypeCode.Byte:\n                break;\n            case TypeCode.Int16:\n                break;\n            case TypeCode.UInt16:\n                break;\n            case TypeCode.Int32:\n                break;\n            case TypeCode.UInt32:\n                break;\n            case TypeCode.Single:\n                break;\n            case TypeCode.String:\n                break;\n            case TypeCode.Decimal:\n                break;\n            case TypeCode.Int64:\n                break;\n            case TypeCode.UInt64:\n                break;\n            case TypeCode.Double:\n                break;\n            case TypeCode.DateTime:\n                break;\n            default:\n                throw new ArgumentException(\"Type is not a valid primitive.\");\n        }\n        return ia.GetBytesObject();\n    }\n    private int GetSize()\n    {\n        var size = 0;\n        switch (Type.GetTypeCode(typeof(T)))\n        {\n            case TypeCode.Boolean:\n                size = 8;\n                break;\n            case TypeCode.Char:\n                size = 16;\n                break;\n            case TypeCode.SByte:\n                size = 8;\n                break;\n            case TypeCode.Byte:\n                size = 8;\n                break;\n            case TypeCode.Int16:\n                size = 16;\n                break;\n            case TypeCode.UInt16:\n                size = 16;\n                break;\n            case TypeCode.Int32:\n                size = 32;\n                break;\n            case TypeCode.UInt32:\n                size = 32;\n                break;\n            case TypeCode.Single:\n                size = 32;\n                break;\n            case TypeCode.String:\n                size = 32;\n                break;\n            case TypeCode.Decimal:\n                size = 96;\n                break;\n            case TypeCode.Int64:\n                size = 64;\n                break;\n            case TypeCode.UInt64:\n                size = 64;\n                break;\n            case TypeCode.Double:\n                size = 64;\n                break;\n            case TypeCode.DateTime:\n                size = 64;\n                break;\n            default:\n                throw new ArgumentException(\"Type is not a valid primitive.\");\n        }\n        return size;\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Detect Entropy Levels from Primitive Data Arrays<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[35,44,46],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/105"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":1,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":106,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/105\/revisions\/106"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}