示例#1
0
        //create new network
        public async void SaveNetwork(Rnetwork rnetwork, Input_Output_Type io_type, List <Input> inputs, List <Output> outputs)
        {
            using (RlmDbEntities db = new RlmDbEntities(databaseName))
            {
                try
                {
                    //ready network for saving
                    Rnetwork _newNetwork = db.Rnetworks.Add(rnetwork);

                    //add inputs to io_type
                    foreach (Input input in inputs)
                    {
                        io_type.Inputs.Add(input);
                    }

                    //add outputs to io_type
                    foreach (Output output in outputs)
                    {
                        io_type.Outputs.Add(output);
                    }

                    //ready io_type for saving
                    Input_Output_Type _ioType = db.Input_Output_Types.Add(io_type);

                    //save to database
                    await db.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    RlmDbLogger.Error(ex, databaseName, "SaveNetwork");
                }
            }
        }
示例#2
0
        //Process new inputs/outputs during create new network
        private object ProcessNewIO(Rnetwork net, RlmIO io, Boolean ProcessAsOutput = false)
        {
            object            retVal = null;
            Input_Output_Type iot;

            //Create Type
            iot = new Input_Output_Type()
            {
                ID = Util.GenerateHashKey(io.DotNetType), Name = io.DotNetType, DotNetTypeName = io.DotNetType
            };
            if (consoleDisplay)
            {
                Console.WriteLine("Creating new Input_Output_Type: " + io.DotNetType);
            }

            if (!ProcessAsOutput)
            {
                //ToDo: Check for unique names

                //Create Input
                Input newio = new Input()
                {
                    ID = Util.GenerateHashKey(io.Name), Name = io.Name, Rnetwork_ID = net.ID, Input_Output_Type_ID = iot.ID, Input_Output_Type = iot, Min = io.Min, Max = io.Max, Type = io.Type
                };
                io.ID  = newio.ID;
                retVal = newio;
                if (consoleDisplay)
                {
                    Console.WriteLine("Create new Input: " + newio.Name);
                }
            }
            else
            {
                //ToDo: Check for unique names

                //Create Output
                Output newio = new Output()
                {
                    ID = Util.GenerateHashKey(io.Name), Name = io.Name, Rnetwork_ID = net.ID, Input_Output_Type_ID = iot.ID, Input_Output_Type = iot, Min = io.Min, Max = io.Max
                };
                io.ID  = newio.ID;
                retVal = newio;
                if (consoleDisplay)
                {
                    Console.WriteLine("Create new Output: " + newio.Name);
                }
            }

            return(retVal);
        }
示例#3
0
        /// <summary>
        /// Save the new network and send it to a task. It also starts the database workers
        /// </summary>
        /// <param name="rnetwork"></param>
        /// <param name="io_types"></param>
        /// <param name="inputs"></param>
        /// <param name="outputs"></param>
        /// <param name="rnn_net"></param>
        public void NewNetwork(Rnetwork rnetwork, List <Input_Output_Type> io_types, List <Input> inputs, List <Output> outputs, IRlmNetwork rnn_net)
        {
            //todo: rnn dbmanager and save
            dbSavingTime.Start();

            RlmDbLogger.Info("\n" + string.Format("[{0:G}]: Started saving data for {1}...", DateTime.Now, Network.DatabaseName), Network.DatabaseName);

            Task t1 = Task.Run(() =>
            {
                rlmDb.SaveNetwork(rnetwork, io_types, inputs, outputs, rnn_net);
            });

            t1.Wait();
            StartRlmDbWorkers();
        }
示例#4
0
        public void SaveNetwork(Rnetwork rnetwork, List <Input_Output_Type> io_types, List <Input> inputs, List <Output> outputs, IRlmNetwork rnn_net)
        {
            using (RlmDbEntities db = new RlmDbEntities(databaseName))
            {
                try
                {
                    //ready network for saving
                    Rnetwork _newNetwork = db.Rnetworks.Add(rnetwork);

                    foreach (var _in in inputs)
                    {
                        Input_Output_Type _iotype = io_types.FirstOrDefault(a => a.DotNetTypeName == _in.Input_Output_Type.DotNetTypeName);

                        _in.Input_Output_Type = _iotype;

                        db.Inputs.Add(_in);
                    }

                    foreach (var _out in outputs)
                    {
                        Input_Output_Type _iotype = io_types.FirstOrDefault(a => a.DotNetTypeName == _out.Input_Output_Type.DotNetTypeName);

                        _out.Input_Output_Type = _iotype;

                        db.Outputs.Add(_out);
                    }

                    //save to database
                    db.SaveChanges();

                    rlm       = _newNetwork;
                    networkID = _newNetwork.ID;

                    networkLoaded = true;

                    rnn_net.MemoryManager.InitStorage(inputs, outputs);
                }
                catch (Exception ex)
                {
                    networkLoaded = false;
                    RlmDbLogger.Error(ex, databaseName, "SaveNetwork");
                }
            }
        }
示例#5
0
        /// <summary>
        /// Save created network
        /// </summary>
        /// <param name="rnetwork">current rnetwork</param>
        /// <param name="io_type">type of input and output</param>
        /// <param name="inputs">List of inputs</param>
        /// <param name="outputs">List of outputs</param>
        public void NewNetwork(Rnetwork rnetwork, Input_Output_Type io_type, List <Input> inputs, List <Output> outputs)
        {
            //todo: rnn dbmanager and save
            rlmDb.SaveNetwork(rnetwork, io_type, inputs, outputs);
            double r = 1.0;
            double s = 1.0;

            foreach (var input in inputs)
            {
                r *= input.Max;
            }

            rneuronsBoundedCapacity = Convert.ToInt32(r);

            foreach (var output in outputs)
            {
                s *= output.Max;
            }

            solutionsBoundedCapacity = Convert.ToInt32(s);
        }
        /// <summary>
        /// Save created network
        /// </summary>
        /// <param name="rnetwork">current rnetwork</param>
        /// <param name="io_type">type of input and output</param>
        /// <param name="inputs">List of inputs</param>
        /// <param name="outputs">List of outputs</param>
        public void NewNetwork(Rnetwork rnetwork, Input_Output_Type io_type, List <Input> inputs, List <Output> outputs)
        {
            //todo: rnn dbmanager and save
            rlmDb.SaveNetwork(rnetwork, io_type, inputs, outputs);
            double r = 1.0;
            double s = 1.0;

            foreach (var input in inputs)
            {
                r *= input.Max;
            }

            rneuronsBoundedCapacity = Convert.ToInt32(r);

            foreach (var output in outputs)
            {
                s *= output.Max;
            }

            solutionsBoundedCapacity = Convert.ToInt32(s);

            //Rneurons = new ConcurrentDictionary<long, Rneuron>(iConcurrencyLevel, rneuronsBoundedCapacity);
            //Solutions = new ConcurrentDictionary<long, Solution>(iConcurrencyLevel, solutionsBoundedCapacity);
        }
        /// <summary>
        /// Sets up a new network and sets the network as current network to use in training.
        /// </summary>
        /// <param name="name">Your preferred network name</param>
        /// <param name="inputs">List of input types for your created network</param>
        /// <param name="outputs">List of output types for your created network</param>
        public void NewNetwork(string name, IEnumerable <RlmIO> inputs, IEnumerable <RlmIO> outputs)
        {
            //Create new network
            Rnetwork newnet = new Rnetwork {
                ID = Util.GenerateHashKey(name), Name = name, DateTimeCreated = DateTime.Now
            };

            CurrentNetworkID   = newnet.ID;
            CurrentNetworkName = newnet.Name;

            // initialize Case Order
            CaseOrder = 0;

            Console.WriteLine("Create new network: " + newnet.Name);

            //Inputs
            var inputsForDb  = new List <Input>();
            var outputsForDb = new List <Output>();
            var ioTypesForDb = new List <Input_Output_Type>();
            int count        = 0;

            foreach (RlmIO io in inputs)
            {
                count++;

                var   newio = ProcessNewIO(newnet, io, false) as Input;
                Input newin = new Input()
                {
                    HashedKey = newio.HashedKey, ID = newio.ID, Input_Output_Type = newio.Input_Output_Type, Input_Output_Type_ID = newio.Input_Output_Type_ID, Max = newio.Max, Min = newio.Min, Name = newio.Name, Input_Values_Reneurons = newio.Input_Values_Reneurons, Rnetwork = newio.Rnetwork, Rnetwork_ID = newio.Rnetwork_ID, Type = newio.Type, Order = count
                };
                inputsForDb.Add(newin);
                InputMomentums.Add(newin.ID, new RlmInputMomentum()
                {
                    InputID = newin.ID
                });

                if (!ioTypesForDb.Any(a => a.DotNetTypeName == newio.Input_Output_Type.DotNetTypeName))
                {
                    ioTypesForDb.Add(newin.Input_Output_Type);
                    newio.Input_Output_Type = null;
                }
            }
            Inputs = inputs;

            //Outputs
            count = 0;
            foreach (RlmIO io in outputs)
            {
                count++;

                var    newio  = ProcessNewIO(newnet, io, true) as Output;
                Output newout = new Output()
                {
                    HashedKey = newio.HashedKey, ID = newio.ID, Input_Output_Type = newio.Input_Output_Type, Input_Output_Type_ID = newio.Input_Output_Type_ID, Max = newio.Max, Min = newio.Min, Name = newio.Name, Output_Values_Solutions = newio.Output_Values_Solutions, Rnetwork = newio.Rnetwork, Rnetwork_ID = newio.Rnetwork_ID, Order = count
                };
                outputsForDb.Add(newout);

                if (!ioTypesForDb.Any(a => a.DotNetTypeName == newio.Input_Output_Type.DotNetTypeName))
                {
                    ioTypesForDb.Add(newout.Input_Output_Type);
                    newio.Input_Output_Type = null;
                }

                // add dynamic output collection
                MemoryManager.DynamicOutputs.TryAdd(newio.ID, new HashSet <SolutionOutputSet>());
            }
            Outputs = outputs;

            SessionCountInitial = SessionCount;

            //create new network
            MemoryManager.NewNetwork(newnet, ioTypesForDb, inputsForDb, outputsForDb, this);
        }
示例#8
0
        //load network
        public LoadRnetworkResult LoadNetwork(string name, IRlmNetwork rnetwork)
        {
            var           retVal  = new LoadRnetworkResult();
            IRlmNetwork   rnn     = rnetwork;
            List <Input>  inputs  = new List <Input>();
            List <Output> outputs = new List <Output>();

            var watch = new Stopwatch();

            watch.Start();

            Rnetwork network;

            try
            {
                using (RlmDbEntities db = new RlmDbEntities(databaseName))
                {
                    //find network by name
                    network = db.Rnetworks.FirstOrDefault(a => a.Name == name);
                }

                if (network == null)
                {
                    //Throw an error
                    Console.WriteLine("Network name '" + name + "' does not exist in the database:" + databaseName);
                }
                else
                {
                    this.rlm = network;

                    // set rnetwork details
                    retVal.CurrentNetworkId   = networkID = this.rlm.ID;
                    retVal.CurrentNetworkName = this.rlm.Name;

                    List <Input>  rnnInputs  = null;
                    List <Output> rnnOutputs = null;

                    var tasks = new List <Task>();


                    int taskCnt      = Environment.ProcessorCount / 2;
                    int batchSizeRn  = 0;
                    int batchSizeIvr = 0;
                    var rnCountTask  = Task.Run(() =>
                    {
                        Stopwatch cntWatch = new Stopwatch();
                        cntWatch.Start();

                        var subTasks      = new Task[3];
                        int totalInputs   = 0;
                        int totalRneurons = 0;
                        int totalIvrs     = 0;

                        subTasks[0] = Task.Run(() =>
                        {
                            using (var ctx = new RlmDbEntities(databaseName))
                            {
                                totalInputs = ctx.Inputs.Count();
                            }
                        });

                        subTasks[1] = Task.Run(() =>
                        {
                            using (var ctx = new RlmDbEntities(databaseName))
                            {
                                totalRneurons = ctx.Rneurons.Count();
                            }
                        });

                        subTasks[2] = Task.Run(() =>
                        {
                            using (var ctx = new RlmDbEntities(databaseName))
                            {
                                totalIvrs = ctx.Input_Values_Reneurons.Count();
                            }
                        });

                        Task.WaitAll(subTasks);

                        batchSizeRn  = Convert.ToInt32(Math.Ceiling(totalRneurons / (double)taskCnt));
                        batchSizeIvr = Convert.ToInt32(Math.Ceiling(totalIvrs / (double)taskCnt));

                        while (batchSizeIvr % totalInputs != 0)
                        {
                            batchSizeIvr++;
                        }

                        cntWatch.Stop();
                        System.Diagnostics.Debug.WriteLine($"Count elapsed: {cntWatch.Elapsed}");
                    });
                    tasks.Add(rnCountTask);

                    var bestSolTask = Task.Run(() =>
                    {
                        IEnumerable <BestSolution> bestSolutions = null;
                        using (var ctx = new RlmDbEntities(databaseName))
                        {
                            bestSolutions = ctx.Database.SqlQuery <BestSolution>(@"
                                SELECT 
	                                main.[Rneuron_ID] as [RneuronId],
	                                main.[Solution_ID] as [SolutionId],
	                                MAX(main.[CycleScore]) as [CycleScore],
	                                MAX(sess.[SessionScore]) as [SessionScore],
	                                MAX(main.[CycleEndTime]) as [CycleEndTime]
                                FROM [Cases] main
                                INNER JOIN [Sessions] sess ON main.[Session_ID] = sess.[ID]
                                GROUP BY main.[Rneuron_ID], main.[Solution_ID]").ToList();
                        }

                        if (bestSolutions != null)
                        {
                            foreach (var item in bestSolutions)
                            {
                                rnetwork.MemoryManager.SetBestSolution(item);
                            }
                        }
                    });
                    tasks.Add(bestSolTask);

                    var inputTask = Task.Run(() =>
                    {
                        using (var ctx = new RlmDbEntities(databaseName))
                        {
                            // get inputs
                            rnnInputs = ctx.Inputs
                                        .Include(a => a.Input_Output_Type)
                                        .OrderBy(a => a.Order)
                                        .ToList();
                        }

                        retVal.Inputs = rnetwork.Inputs = rnnInputs.Select(a => new RlmIO()
                        {
                            ID         = a.ID,
                            Name       = a.Name,
                            DotNetType = a.Input_Output_Type.DotNetTypeName,
                            Min        = a.Min,
                            Max        = a.Max,
                            Type       = a.Type
                        });

                        rnetwork.InputMomentums.Clear();
                        foreach (var item in rnetwork.Inputs)
                        {
                            if (item.Type == Enums.RlmInputType.Linear)
                            {
                                rnetwork.InputMomentums.Add(item.ID, new RlmInputMomentum()
                                {
                                    InputID = item.ID
                                });
                            }
                        }
                        retVal.InputMomentums = rnetwork.InputMomentums;
                    });
                    tasks.Add(inputTask);

                    var outputTask = Task.Run(() =>
                    {
                        using (var ctx = new RlmDbEntities(databaseName))
                        {
                            // get outputs
                            rnnOutputs = ctx.Outputs
                                         .Include(a => a.Input_Output_Type)
                                         .OrderBy(a => a.Order)
                                         .ToList();
                        }

                        retVal.Outputs = rnetwork.Outputs = rnnOutputs.Select(a => new RlmIO()
                        {
                            ID         = a.ID,
                            Name       = a.Name,
                            DotNetType = a.Input_Output_Type.DotNetTypeName,
                            Min        = a.Min,
                            Max        = a.Max
                        });

                        foreach (var output in rnetwork.Outputs)
                        {
                            // add dynamic output collection
                            rnetwork.MemoryManager.DynamicOutputs.TryAdd(output.ID, new HashSet <SolutionOutputSet>());
                        }
                    });
                    tasks.Add(outputTask);

                    var sessionsTask = Task.Run(() =>
                    {
                        IEnumerable <Session> sessions = null;
                        using (var ctx = new RlmDbEntities(databaseName))
                        {
                            // get sessions and save to MemoryManager cache
                            sessions = ctx.Sessions.OrderBy(a => a.DateTimeStart).ToList();

                            // set CaseOrder to the last case saved in db
                            retVal.CaseOrder = ctx.Cases.OrderByDescending(a => a.Order).Select(a => a.Order).FirstOrDefault();
                        }

                        if (sessions != null)
                        {
                            //set sessions count
                            retVal.SessionCount = sessions.Count();
                            foreach (var item in sessions)
                            {
                                rnetwork.MemoryManager.Sessions.TryAdd(item.ID, item);
                            }
                        }
                    });
                    tasks.Add(sessionsTask);

                    var rneuronsTask = Task.WhenAll(inputTask, rnCountTask).ContinueWith((t) =>
                    {
                        Stopwatch rn_sw = new Stopwatch();
                        rn_sw.Start();

                        var subTasks = new List <Task>();

                        // made input dictionary to help in setting the Dynamic inputs
                        var inputDic = rnnInputs.ToDictionary(a => a.ID, a => a);

                        var rneurons = new ConcurrentBag <Rneuron>();
                        var ivrs     = new ConcurrentDictionary <long, List <Input_Values_Rneuron> >();
                        //IEnumerable<Rneuron> rneurons = null;

                        Stopwatch subProcessWatch = new Stopwatch();
                        subProcessWatch.Start();

                        for (int i = 0; i < taskCnt; i++)
                        {
                            int batchNum = i;
                            subTasks.Add(Task.Run(() =>
                            {
                                Rneuron[] results;
                                using (var ctx = new RlmDbEntities(databaseName))
                                {
                                    results = ctx.Rneurons.OrderBy(a => a.ID).Skip(batchNum * batchSizeRn).Take(batchSizeRn).ToArray();
                                }
                                foreach (var item in results)
                                {
                                    rneurons.Add(item);
                                }
                            }));

                            subTasks.Add(Task.Run(() =>
                            {
                                Input_Values_Rneuron[] results;
                                using (var ctx = new RlmDbEntities(databaseName))
                                {
                                    results = ctx.Input_Values_Reneurons.OrderBy(a => a.Rneuron_ID).Skip(batchNum * batchSizeIvr).Take(batchSizeIvr).ToArray();
                                }
                                foreach (var item in results.GroupBy(a => a.Rneuron_ID))
                                {
                                    ivrs.TryAdd(item.Key, item.ToList());
                                }
                            }));
                        }

                        Task.WaitAll(subTasks.ToArray());
                        subProcessWatch.Stop();
                        System.Diagnostics.Debug.WriteLine($"Get data: {subProcessWatch.Elapsed}");

                        subTasks.Clear();

                        subProcessWatch.Restart();

                        for (int i = 0; i < taskCnt; i++)
                        {
                            int batchNum = i;
                            subTasks.Add(Task.Run(() =>
                            {
                                //Stopwatch sw = new Stopwatch();
                                //sw.Start();

                                //IEnumerable<Rneuron> rneurons = null;
                                //using (var ctx = new RlmDbEntities(databaseName))
                                //{
                                //    rneurons = ctx.Rneurons
                                //        .Include(a => a.Input_Values_Reneurons)
                                //        .OrderBy(a => a.ID)
                                //        .Skip(batchNum * batchSizeRn)
                                //        .Take(batchSizeRn)
                                //        .ToList();
                                //}

                                //sw.Stop();
                                //System.Diagnostics.Debug.WriteLine($"Task: {Task.CurrentId}, Get Data: {sw.Elapsed}");

                                //sw.Restart();

                                //sw.Start();

                                foreach (var item in rneurons.Skip(batchNum * batchSizeRn).Take(batchSizeRn))
                                {
                                    // set input type and dotnettype
                                    item.Input_Values_Reneurons = ivrs[item.ID];
                                    foreach (var ivr in item.Input_Values_Reneurons)
                                    {
                                        var input      = inputDic[ivr.Input_ID];
                                        ivr.InputType  = input.Type;
                                        ivr.DotNetType = input.Input_Output_Type.DotNetTypeName;
                                        ivr.Input      = input;
                                    }

                                    item.Input_Values_Reneurons = item.Input_Values_Reneurons.OrderBy(a => a.Input.Order).ToList();

                                    rnetwork.MemoryManager.SetRneuronWithInputs(item);
                                }

                                //sw.Stop();
                                //System.Diagnostics.Debug.WriteLine($"Task: {Task.CurrentId}, Process Data: {sw.Elapsed}");
                            }));
                        }

                        /** old batching code
                         * int totalRneurons = db.Rneurons.Count();
                         * int pageCount = 100;
                         * var helper = new StaticPagedList<Rneuron>(
                         *              Enumerable.Empty<Rneuron>(), 1, pageCount, totalRneurons);
                         * Parallel.For(1, helper.PageCount + 1, i =>
                         * {
                         *
                         *  using (var rdb = new RlmDbEntities(databaseName))
                         *  {
                         *      var data = rdb.Rneurons.Include(a => a.Input_Values_Reneurons).OrderBy(u => u.ID).ToPagedList(i, helper.PageSize).ToList();
                         *
                         *      foreach (var item in data)
                         *      {
                         *          // set input type and dotnettype
                         *          foreach (var ivr in item.Input_Values_Reneurons)
                         *          {
                         *              var input = inputDic[ivr.Input_ID];
                         *              ivr.InputType = input.Type;
                         *              ivr.DotNetType = input.Input_Output_Type.DotNetTypeName;
                         *              ivr.Input = input;
                         *          }
                         *
                         *          item.Input_Values_Reneurons = item.Input_Values_Reneurons.OrderBy(a => a.Input.Order).ToList();
                         *
                         *          rnetwork.MemoryManager.SetRneuronWithInputs(item);
                         *      }
                         *  }
                         * });
                         *
                         * if (rneurons != null)
                         * {
                         *  foreach (var item in rneurons)
                         *  {
                         *      // set input type and dotnettype
                         *      foreach (var ivr in item.Input_Values_Reneurons)
                         *      {
                         *          var input = inputDic[ivr.Input_ID];
                         *          ivr.InputType = input.Type;
                         *          ivr.DotNetType = input.Input_Output_Type.DotNetTypeName;
                         *          ivr.Input = input;
                         *      }
                         *
                         *      item.Input_Values_Reneurons = item.Input_Values_Reneurons.OrderBy(a => a.Input.Order).ToList();
                         *
                         *      rnetwork.MemoryManager.SetRneuronWithInputs(item);
                         *  }
                         * } */

                        Task.WaitAll(subTasks.ToArray());
                        subProcessWatch.Stop();
                        System.Diagnostics.Debug.WriteLine($"Process data: {subProcessWatch.Elapsed}");

                        rn_sw.Stop();
                        System.Diagnostics.Debug.WriteLine($"Total rneuron task elapsed: {rn_sw.Elapsed}");
                        ;
                    });
                    tasks.Add(rneuronsTask);

                    var solutionTask = outputTask.ContinueWith((t) =>
                    {
                        IEnumerable <Solution> solutions = null;
                        using (var ctx = new RlmDbEntities(databaseName))
                        {
                            // get solutions and save to MemoryManager cache
                            solutions = ctx.Solutions.Include(a => a.Output_Values_Solutions).ToList();
                        }

                        if (solutions != null)
                        {
                            foreach (var item in solutions)
                            {
                                rnetwork.MemoryManager.SetSolutionWithOutputs(item);
                            }
                        }
                    });
                    tasks.Add(solutionTask);

                    Task.WaitAll(tasks.ToArray());

                    retVal.Loaded = true;
                }
            }
            catch (Exception ex)
            {
                RlmDbLogger.Error(ex, databaseName, "LoadNetwork");
            }

            watch.Stop();
            System.Diagnostics.Debug.WriteLine($"Load Network Elapsed: {watch.Elapsed}");

            return(retVal);
        }
示例#9
0
        //load network
        public LoadRnetworkResult LoadNetwork(string name, IRlmNetwork rnetwork)
        {
            var           retVal  = new LoadRnetworkResult();
            IRlmNetwork   rnn     = rnetwork;
            List <Input>  inputs  = new List <Input>();
            List <Output> outputs = new List <Output>();

            using (RlmDbEntities db = new RlmDbEntities(databaseName))
            {
                try
                {
                    //find network by name
                    var network = from net in db.Rnetworks
                                  where net.Name.ToLower() == name.ToLower()
                                  select net;

                    if (network.Count() == 0)
                    {
                        //Throw an error
                        Console.WriteLine("Network name '" + name + "' does not exist in the database:" + db.Database.Connection.ToString());
                    }
                    else
                    {
                        var rnetworkFromDb = network.First <Rnetwork>();
                        this.rlm = rnetworkFromDb;

                        // set rnetwork details
                        retVal.CurrentNetworkId   = networkID = this.rlm.ID;
                        retVal.CurrentNetworkName = this.rlm.Name;

                        // get inputs
                        var rnnInputs = db.Inputs
                                        .Include(a => a.Input_Output_Type)
                                        .OrderBy(a => a.Order)
                                        .ToList();

                        rnetwork.Inputs = rnnInputs.Select(a => new RlmIO()
                        {
                            ID         = a.ID,
                            Name       = a.Name,
                            DotNetType = a.Input_Output_Type.DotNetTypeName,
                            Min        = a.Min,
                            Max        = a.Max,
                            Type       = a.Type
                        });

                        rnetwork.InputMomentums.Clear();
                        foreach (var item in rnetwork.Inputs)
                        {
                            if (item.Type == Enums.RlmInputType.Linear)
                            {
                                rnetwork.InputMomentums.Add(item.ID, new RlmInputMomentum()
                                {
                                    InputID = item.ID
                                });
                            }
                        }

                        // get outputs
                        var rnnOutputs = db.Outputs
                                         .Include(a => a.Input_Output_Type)
                                         .OrderBy(a => a.Order)
                                         .ToList();

                        rnetwork.Outputs = rnnOutputs.Select(a => new RlmIO()
                        {
                            ID         = a.ID,
                            Name       = a.Name,
                            DotNetType = a.Input_Output_Type.DotNetTypeName,
                            Min        = a.Min,
                            Max        = a.Max
                        });

                        foreach (var output in rnetwork.Outputs)
                        {
                            // add dynamic output collection
                            rnetwork.MemoryManager.DynamicOutputs.TryAdd(output.ID, new HashSet <SolutionOutputSet>());
                        }

                        // initialize MemoryManager dictionaries (Rneurons, Solutions, etc...)
                        //rnetwork.MemoryManager.InitStorage(rnetwork.Inputs.Select(a =>
                        //{
                        //    return new Input
                        //    {
                        //        ID = a.ID,
                        //        Max = a.Max,
                        //        Min = a.Min,
                        //        Name = a.Name,
                        //        Rnetwork_ID = rnetwork.CurrentNetworkID,
                        //        Type = a.Type
                        //    };
                        //}).ToList(), rnetwork.Outputs.Select(a => {
                        //    return new Output
                        //    {
                        //        ID = a.ID,
                        //        Max = a.Max,
                        //        Min = a.Min,
                        //        Name = a.Name,
                        //        Rnetwork_ID = rnetwork.CurrentNetworkID
                        //    };
                        //}).ToList());

                        // get sessions and save to MemoryManager cache
                        var sessions = db.Sessions.OrderBy(a => a.DateTimeStart).ToList();
                        foreach (var item in sessions)
                        {
                            rnetwork.MemoryManager.Sessions.TryAdd(item.ID, item);
                        }

                        //set sessions count
                        retVal.SessionCount = sessions.Count;

                        // set CaseOrder to the last case saved in db
                        var lastCase = db.Cases.OrderByDescending(a => a.Order).FirstOrDefault();
                        if (lastCase != null)
                        {
                            retVal.CaseOrder = lastCase.Order;
                        }

                        // made input dictionary to help in setting the Dynamic inputs
                        var inputDic = rnnInputs.ToDictionary(a => a.ID, a => a);

                        // get Rneurons and save to MemoryManager cache
                        //var rneurons = db.Rneurons.Include(a => a.Input_Values_Reneurons).ToList();

                        //batching
                        int totalRneurons = db.Rneurons.Count();
                        int pageCount     = 100;
                        var helper        = new StaticPagedList <Rneuron>(
                            Enumerable.Empty <Rneuron>(), 1, pageCount, totalRneurons);
                        Parallel.For(1, helper.PageCount + 1, i =>
                        {
                            using (var rdb = new RlmDbEntities(databaseName))
                            {
                                var data = rdb.Rneurons.Include(a => a.Input_Values_Reneurons).OrderBy(u => u.ID).ToPagedList(i, helper.PageSize).ToList();

                                foreach (var item in data)
                                {
                                    // set input type and dotnettype
                                    foreach (var ivr in item.Input_Values_Reneurons)
                                    {
                                        var input      = inputDic[ivr.Input_ID];
                                        ivr.InputType  = input.Type;
                                        ivr.DotNetType = input.Input_Output_Type.DotNetTypeName;
                                        ivr.Input      = input;
                                    }

                                    item.Input_Values_Reneurons = item.Input_Values_Reneurons.OrderBy(a => a.Input.Order).ToList();

                                    rnetwork.MemoryManager.SetRneuronWithInputs(item);
                                }
                            }
                        });
                        //end batching

                        //foreach (var item in rneurons)
                        //{
                        //    // set input type and dotnettype
                        //    foreach (var ivr in item.Input_Values_Reneurons)
                        //    {
                        //        var input = inputDic[ivr.Input_ID];
                        //        ivr.InputType = input.Type;
                        //        ivr.DotNetType = input.Input_Output_Type.DotNetTypeName;
                        //        ivr.Input = input;
                        //    }

                        //    item.Input_Values_Reneurons = item.Input_Values_Reneurons.OrderBy(a => a.Input.Order).ToList();

                        //    rnetwork.MemoryManager.SetRneuronWithInputs(item);
                        //}

                        // get solutions and save to MemoryManager cache
                        var solutions = db.Solutions.Include(a => a.Output_Values_Solutions).ToList();
                        foreach (var item in solutions)
                        {
                            rnetwork.MemoryManager.SetSolutionWithOutputs(item);
                        }

                        // get best solutions and save to MemoryManager cache
                        //var solCount = db.Database.SqlQuery<Int32>(@"SELECT COUNT(*) FROM(SELECT

                        //        main.[Rneuron_ID] as [RneuronId],
                        //        main.[Solution_ID] as [SolutionId],
                        //        MAX(main.[CycleScore]) as [CycleScore],
                        //        MAX(sess.[SessionScore]) as [SessionScore],
                        //        MAX(main.[CycleEndTime]) as [CycleEndTime]
                        //    FROM[Cases] main
                        //    INNER JOIN[Sessions] sess ON main.[Session_ID] = sess.[ID]
                        //    GROUP BY main.[Rneuron_ID], main.[Solution_ID]) AS a").First();


                        var bestSolutions = db.Database.SqlQuery <BestSolution>(@"
                            SELECT 
	                            main.[Rneuron_ID] as [RneuronId],
	                            main.[Solution_ID] as [SolutionId],
	                            MAX(main.[CycleScore]) as [CycleScore],
	                            MAX(sess.[SessionScore]) as [SessionScore],
	                            MAX(main.[CycleEndTime]) as [CycleEndTime]
                            FROM [Cases] main
                            INNER JOIN [Sessions] sess ON main.[Session_ID] = sess.[ID]
                            GROUP BY main.[Rneuron_ID], main.[Solution_ID]")
                                            .ToList();
                        foreach (var item in bestSolutions)
                        {
                            rnetwork.MemoryManager.SetBestSolution(item);
                        }

                        retVal.Loaded = true;
                    }
                }
                catch (Exception ex)
                {
                    RlmDbLogger.Error(ex, databaseName, "LoadNetwork");
                }
            }

            return(retVal);
        }