public static BackendInstance GetInstance(UIAdapter ui, Random rng = null)
        {
            Logger.Debug("Creating backend instance.");

            SpeciesFileDescription speciesFileDescription = FileSystemService.GetSpeciesMappings();

            // Map species classes to list of species
            IEnumerable <(SpeciesClass, IList <SpeciesMapping>)> speciesClassMappings =
                speciesFileDescription
                .SpeciesClassMappings
                .Select(classMapping => (
                            SpeciesFactory.GetSpeciesClass(classMapping)
                            , classMapping.SpeciesClassSpeciesMappings))
                .ToList();

            IEnumerable <Species> species
                = speciesClassMappings
                  .AsParallel()
                  .SelectMany(tuple => {
                SpeciesClass parentClass = tuple.Item1;
                IList <SpeciesMapping> speciesMappings = tuple.Item2;

                IEnumerable <Species> childrenSpecies
                    = new List <Species>(speciesMappings.Count);

                childrenSpecies = childrenSpecies
                                  .Concat(speciesMappings.Select(
                                              s => SpeciesFactory.GetSpecies(s, parentClass)));

                return(childrenSpecies);
            }).ToList();

            Random rngToUse = rng ?? new Random();

            BackendInstance instance = new BackendInstance(ui, species, rngToUse);

            Logger.Debug("Species loaded and models created.");

            return(instance);
        }