예제 #1
0
        public void ScalarEncoderUnitTestNonPeriodic(double input, int[] expectedResult)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> encoderSettings = new Dictionary <string, object>();

            encoderSettings.Add("W", 25);
            encoderSettings.Add("N", (int)0);
            encoderSettings.Add("MinVal", (double)1);
            encoderSettings.Add("MaxVal", (double)50);
            encoderSettings.Add("Radius", (double)2.5);
            encoderSettings.Add("Resolution", (double)0);
            encoderSettings.Add("Periodic", (bool)false);
            encoderSettings.Add("ClipInput", (bool)true);
            encoderSettings.Add("Name", "TestScalarEncoder");
            encoderSettings.Add("IsRealCortexModel", true);

            ScalarEncoder encoder = new ScalarEncoder(encoderSettings);

            var result = encoder.Encode(input);

            Debug.WriteLine(input);
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(expectedResult));

            Assert.IsTrue(expectedResult.SequenceEqual(result));
        }
예제 #2
0
        public void SeasonEncoderTest(int input, int[] expectedResult)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            ScalarEncoder encoder = new ScalarEncoder(new Dictionary <string, object>()
            {
                { "W", 3 },
                { "N", 12 },
                { "Radius", -1.0 },
                { "MinVal", 1.0 },
                { "MaxVal", 366.0 },
                { "Periodic", true },
                { "Name", "season" },
                { "ClipInput", true },
            });

            //for (int i = 1; i < 367; i++)
            //{
            var result = encoder.Encode(input);

            Debug.WriteLine(input);

            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(expectedResult));
            //}

            Assert.IsTrue(expectedResult.SequenceEqual(result));
        }
예제 #3
0
        public void TimeTickEncodingTest(double input, int[] expectedResult)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            DateTime now = DateTime.Now;

            ScalarEncoder encoder = new ScalarEncoder(new Dictionary <string, object>()
            {
                { "W", 21 },
                { "N", 1024 },
                { "Radius", -1.0 },
                { "MinVal", 0.0 },
                { "MaxVal", (double)(now - now.AddYears(-1)).TotalDays },
                { "Periodic", true },
                { "Name", "season" },
                { "ClipInput", true },
            });

            for (long i = 0; i < (long)encoder.MaxVal; i += 1)
            {
                var to = (double)(now - now.AddYears(-1)).Ticks;

                input = (double)i;

                var result = encoder.Encode(input);

                Debug.WriteLine(input);

                Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));

                Assert.IsTrue(result.Count(k => k == 1) == encoder.W);
            }

            //Assert.IsTrue(expectedResult.SequenceEqual(result));
        }
예제 #4
0
        public void InitMultiencoder()
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            // Gets set of default properties, which more or less every encoder requires.
            Dictionary <string, object> encoderSettings = getDefaultSettings();

            encoderSettings[EncoderProperties.EncoderQualifiedName] = typeof(TestEncoder).AssemblyQualifiedName;

            // We change here value of Name property.
            encoderSettings["Name"] = "hello";

            // We add here new property.
            encoderSettings.Add("TestProp1", "hello");

            var encoder = ctx.CreateEncoder(typeof(TestEncoder).FullName, encoderSettings);

            // Property can also be set this way.
            encoder["abc"] = "1";

            Assert.IsTrue((string)encoder["TestProp1"] == "hello");

            Assert.IsTrue((string)encoder["Name"] == "hello");

            Assert.IsTrue((string)encoder["abc"] == "1");
        }
예제 #5
0
        public void EncodeFullDateTimeTest(int w, double r, Object input, int[] expectedOutput)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            var now = DateTimeOffset.Now;

            Dictionary <string, Dictionary <string, object> > encoderSettings = getFullEncoderSettings();

            var encoder = new DateTimeEncoder(encoderSettings, DateTimeEncoder.Precision.Days);

            var result = encoder.Encode(DateTimeOffset.Parse(input.ToString()));

            // This is a limitation for 2D drawing only.
            if ((result.Length % 2) != 0)
            {
                throw new ArgumentException("Only odd number of bits is allowed. Please set Offset pproperty of all encoders to odd value.");
            }

            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));

            int[,] twoDimenArray = ArrayUtils.Make2DArray <int>(result, (int)Math.Sqrt(result.Length), (int)Math.Sqrt(result.Length));
            var twoDimArray = ArrayUtils.Transpose(twoDimenArray);

            NeoCortexUtils.DrawBitmap(twoDimArray, 1024, 1024, $"FullDateTime_out_{input.ToString().Replace("/", "-").Replace(":", "-")}_32x32-N-{encoderSettings["DateTimeEncoder"]["N"]}-W-{encoderSettings["DateTimeEncoder"]["W"]}.png", Color.Yellow, Color.Black);

            // Assert.IsTrue(result.SequenceEqual(expectedOutput));
        }
예제 #6
0
        public void EncodeDateTimeTest(int w, double r, Object input, int[] expectedOutput)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            var now = DateTimeOffset.Now;

            Dictionary <string, Dictionary <string, object> > encoderSettings = new Dictionary <string, Dictionary <string, object> >();

            encoderSettings.Add("DateTimeEncoder", new Dictionary <string, object>()
            {
                { "W", 21 },
                { "N", 1024 },
                { "MinVal", now.AddYears(-10) },
                { "MaxVal", now },
                { "Periodic", false },
                { "Name", "DateTimeEncoder" },
                { "ClipInput", false },
                { "Padding", 5 },
            });

            var encoder = new DateTimeEncoder(encoderSettings, DateTimeEncoder.Precision.Days);

            var result = encoder.Encode(DateTimeOffset.Parse(input.ToString()));

            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));
            //Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(expectedOutput));

            int[,] twoDimenArray = ArrayUtils.Make2DArray <int>(result, 32, 32);
            var twoDimArray = ArrayUtils.Transpose(twoDimenArray);

            NeoCortexUtils.DrawBitmap(twoDimArray, 1024, 1024, $"DateTime_out_{input.ToString().Replace("/", "-").Replace(":", "-")}_32x32-N-{encoderSettings["DateTimeEncoder"]["N"]}-W-{encoderSettings["DateTimeEncoder"]["W"]}.png");

            // Assert.IsTrue(result.SequenceEqual(expectedOutput));
        }
        public void InitTest2()
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> encoderSettings = getDefaultSettings();

            var encoder = ctx.CreateEncoder(typeof(DateTimeEncoder).FullName, encoderSettings);

            foreach (var item in encoderSettings)
            {
                Assert.IsTrue(item.Value == encoder[item.Key]);
            }
        }
예제 #8
0
        public void EncodeTimeOnlyTest3(Object input, int[] expectedOutput)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> encoderSettings = getDefaultSettings();

            DateTimeEncoderExperimental encoder = new DateTimeEncoderExperimental(encoderSettings);

            var result = encoder.EncodeTimeOnly(input);

            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(expectedOutput));
            Assert.IsTrue(result.SequenceEqual(expectedOutput));
        }
예제 #9
0
        public void TestSequence()
        {
            CortexNetworkContext context = new CortexNetworkContext();

            var descriptor = loadMetaDataWithCategoricLabel();

            var data = loadSampleDate();

            DataSequenceSensor sensor = new DataSequenceSensor(data, descriptor, context);

            while (sensor.MoveNext())
            {
                Debug.WriteLine(Helpers.StringifyVector(sensor.Current));
            }
        }
        public void EncodeTimeOnlyTest(Object input, int[] expectedOutput)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> encoderSettings = getDefaultSettings();

            DateTimeEncoder encoder = new DateTimeEncoder(encoderSettings);

            var result = encoder.EncodeTimeOnly(input);

            foreach (var item in result)
            {
                Debug.Write(item + ",");
            }
            Assert.IsTrue(result.SequenceEqual(expectedOutput));
        }
예제 #11
0
        public void ScalarEncoderUnitTestPeriodic(double input, int[] expectedResult)
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> encoderSettings = getDefaultSettings();

            ScalarEncoder encoder = new ScalarEncoder(encoderSettings);

            var result = encoder.Encode(input);

            Debug.WriteLine(input);
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(result));
            Debug.WriteLine(NeoCortexApi.Helpers.StringifyVector(expectedResult));

            Assert.IsTrue(expectedResult.SequenceEqual(result));
        }
예제 #12
0
        /// <summary>
        /// Main constructor
        /// </summary>
        public DataMapper(DataDescriptor descriptor, CortexNetworkContext context)
        {
            this.m_Context    = context;
            this.m_Descriptor = descriptor;

            foreach (var feature in descriptor.Features)
            {
                if (feature.EncoderSettings != null)
                {
                    feature.Encoder = this.m_Context.CreateEncoder(feature.EncoderSettings);
                }
                else
                {
                    throw new ArgumentException("Encoder settings not specified.");
                }
            }
        }
        public void InitializeAllEncodersTest()
        {
            CortexNetworkContext ctx = new CortexNetworkContext();

            Assert.IsTrue(ctx.Encoders != null && ctx.Encoders.Count > 0);

            Dictionary <string, object> encoderSettings = getDefaultSettings();

            foreach (var item in ctx.Encoders)
            {
                var encoder = ctx.CreateEncoder(typeof(DateTimeEncoder).FullName, encoderSettings);

                foreach (var sett in encoderSettings)
                {
                    Assert.IsTrue(sett.Value == encoder[sett.Key]);
                }
            }
        }
예제 #14
0
        /// <summary>
        /// Create a List of encoded data as an array of 0 and 1
        /// <br>Scalar Encoder initiation,</br>
        /// <br>logging the encoded data information to CSV file</br>
        /// <br>draw encoded data to bitmaps</br>
        /// </summary>
        /// <param name="inputDoubleArray"></param>
        /// <param name="inputDimSize">how many elements the ouput has</param>
        /// <returns></returns>
        internal List <int[]> ScalarEncoderDoubleArray(
            double[] inputDoubleArray,
            int inputDimSize,
            String testFolder)
        {
            List <int[]>                arrays          = new List <int[]>();
            int                         encodeDim       = inputDimSize;
            CortexNetworkContext        ctx             = new CortexNetworkContext();
            Dictionary <string, object> encoderSettings = new Dictionary <string, object>
            {
                { "W", 25 },
                { "N", encodeDim *encodeDim },
                { "MinVal", inputDoubleArray.Min() - 0.01 },
                { "MaxVal", inputDoubleArray.Max() + 0.01 },
                { "Radius", (double)2.5 },
                { "Resolution", (double)0 },
                { "Periodic", (bool)false },
                { "ClipInput", (bool)true },
                { "Name", "TestScalarEncoder" },
                { "IsRealCortexModel", true }
            };

            ScalarEncoder encoder = new ScalarEncoder(encoderSettings);

            for (int i = 0; i < inputDoubleArray.Length; i++)
            {
                Debug.WriteLine($"Output Dimension of the Scalar Encoder : {encoder.N}");
                var result = encoder.Encode(inputDoubleArray[i]);
                Debug.WriteLine($"the input value is {inputDoubleArray[i]}");
                Debug.WriteLine($"resulting SDR: {NeoCortexApi.Helpers.StringifyVector(result)}");
                arrays.Add(result);
                int[,] arrayToDraw = ArrayUtils.Transpose(ArrayUtils.Make2DArray <int>(result, encodeDim, encodeDim));
                NeoCortexUtils.DrawBitmap(
                    arrayToDraw,
                    OutImgSize, OutImgSize,
                    $"{outputFolder}\\{testFolder}\\{encoderOutputFolder}\\encodedValnumber_{i}.png",
                    Color.FromArgb(44, 44, 44),
                    Color.FromArgb(200, 200, 250),
                    $"encodedVal of {inputDoubleArray[i]}");
            }
            LogToCSV(inputDoubleArray, arrays, $"{testFolder}\\{logOutputFolder}\\scalarEncoderOutput.csv");
            return(arrays);
        }
        private float Train(int inpBits, IHtmModule <object, object> network, HtmClassifier <double, ComputeCycle> cls, bool isNewBornMode = true)
        {
            float accurracy;

            string outFolder = nameof(RunPowerPredictionExperiment);

            Directory.CreateDirectory(outFolder);

            CortexNetworkContext ctx = new CortexNetworkContext();

            Dictionary <string, object> scalarEncoderSettings = getScalarEncoderDefaultSettings(inpBits);
            //var dateTimeEncoderSettings = getFullDateTimeEncoderSettings();

            ScalarEncoder scalarEncoder = new ScalarEncoder(scalarEncoderSettings);
            //DateTimeEncoder dtEncoder = new DateTimeEncoder(dateTimeEncoderSettings, DateTimeEncoder.Precision.Hours);

            string fileName = "TestFiles\\rec-center-hourly-short.csv";

            using (StreamReader sr = new StreamReader(fileName))
            {
                string line;
                int    cnt     = 0;
                int    matches = 0;

                using (StreamWriter sw = new StreamWriter("out.csv"))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        cnt++;

                        //if (isNewBornMode && cnt > 100) break;

                        bool x = false;
                        if (x)
                        {
                            break;
                        }
                        List <int> output = new List <int>();

                        string[] tokens = line.Split(",");

                        // Encode scalar value
                        var result = scalarEncoder.Encode(tokens[1]);

                        output.AddRange(result);

                        // This part adds datetime components to the input vector.
                        //output.AddRange(new int[scalarEncoder.Offset]);
                        //DateTime dt = DateTime.Parse(tokens[0], CultureInfo.InvariantCulture);
                        // Encode date/time/hour.
                        //result = dtEncoder.Encode(new DateTimeOffset(dt, TimeSpan.FromMilliseconds(0)));
                        //output.AddRange(result);

                        // This performs a padding to the inputBits = 10404 = 102*102.
                        output.AddRange(new int[inpBits - output.Count]);

                        var outArr = output.ToArray();

                        Debug.WriteLine($"-------------- {tokens[1]} --------------");

                        if (isNewBornMode)
                        {
                            for (int j = 0; j < 10; j++)
                            {
                                // Output here are active cells.
                                var res = network.Compute(output.ToArray(), true);

                                Debug.WriteLine(Helpers.StringifyVector(((int[])res)));
                            }
                        }
                        else
                        {
                            var lyrOut = network.Compute(output.ToArray(), true) as ComputeCycle;;

                            double input = Convert.ToDouble(tokens[1], CultureInfo.InvariantCulture);

                            if (input == lastPredictedValue)
                            {
                                matches++;
                                Debug.WriteLine($"Match {input}");
                            }
                            else
                            {
                                Debug.WriteLine($"Missmatch Actual value: {input} - Predicted value: {lastPredictedValue}");
                            }

                            cls.Learn(input, lyrOut.ActiveCells.ToArray());

                            lastPredictedValue = cls.GetPredictedInputValue(lyrOut.PredictiveCells.ToArray());

                            sw.WriteLine($"{tokens[0]};{input.ToString(CultureInfo.InvariantCulture)};{lastPredictedValue.ToString(CultureInfo.InvariantCulture)}");

                            Debug.WriteLine($"W: {Helpers.StringifyVector(lyrOut.WinnerCells.Select(c => c.Index).ToArray())}");
                            Debug.WriteLine($"P: {Helpers.StringifyVector(lyrOut.PredictiveCells.Select(c => c.Index).ToArray())}");
                            Debug.WriteLine($"Current input: {input} Predicted Input: {lastPredictedValue}");

                            int[,] twoDimenArray = ArrayUtils.Make2DArray <int>(outArr, (int)Math.Sqrt(outArr.Length), (int)Math.Sqrt(output.Count));
                            var twoDimArray = ArrayUtils.Transpose(twoDimenArray);
                            NeoCortexUtils.DrawBitmap(twoDimArray, 1024, 1024, $"{outFolder}\\{tokens[0].Replace("/", "-").Replace(":", "-")}.png", Color.Yellow, Color.Black, text: input.ToString());
                        }

                        Debug.WriteLine($"NewBorn stage: {isNewBornMode} - record: {cnt}");
                    }
                }

                accurracy = (float)matches / (float)cnt * (float)100.0;
            }

            return(accurracy);
        }