Example #1
0
        private static void LongArrayTest()
        {
            Console.WriteLine("################################");
            Console.WriteLine("LONG Array");
            Console.WriteLine("################################");
            long[,,] dataArray = null;

            List <double> searchTimes = new List <double>();

            _watch.Restart();

            long worldSize = _xSize * _ySize * _zSize;

            try
            {
                dataArray = new long[_xSize, _ySize, _zSize];
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Failed to create array, size would have been {_xSize * _ySize * _zSize} MB");
                Console.ReadLine();
            }

            if (dataArray != null)
            {
                Console.WriteLine($"Instantiating array with {worldSize.ToString("#,####")} cells took {_watch.Elapsed.TotalMilliseconds} ms");
                Random rnd = new Random();

                _watch.Restart();
                for (int x = 0; x < _xSize; x++)
                {
                    for (int y = 0; y < _ySize; y++)
                    {
                        for (int z = 0; z < _zSize; z++)
                        {
                            dataArray[x, y, z] = (short)rnd.Next(0, short.MaxValue);
                        }
                    }
                }
                Console.WriteLine($"Filling array with random values took {_watch.Elapsed.TotalMilliseconds} ms");

                for (int i = 0; i < 10000; i++)
                {
                    int rndX = rnd.Next(0, _xSize);
                    int rndY = rnd.Next(0, _ySize);
                    int rndZ = rnd.Next(0, _zSize);

                    _watch.Restart();
                    long cellValue = dataArray[rndX, rndY, rndZ];
                    searchTimes.Add(_watch.Elapsed.TotalMilliseconds);
                }

                Console.WriteLine($"Searching array took {searchTimes.Average().ToString("#,###0.0000000000")} ms on average");
                Console.WriteLine($"Array Size {GetArraySize_Long(dataArray.Length)}MB");
            }

            Console.WriteLine("################################");
            Console.WriteLine("LONG Array End");
            Console.WriteLine("################################");
        }
Example #2
0
    public static void Main()
    {
        Search s = new Search();

        string[] str = Console.ReadLine().Split(' ');
        int      h   = int.Parse(str[0]);
        int      w   = int.Parse(str[1]);

        long[,] c = new long[10, 10];
        for (int i = 0; i < 10; i++)
        {
            str = Console.ReadLine().Split(' ');
            for (int j = 0; j < 10; j++)
            {
                c[i, j] = long.Parse(str[j]);
            }
        }
        long[,,] b = s.GetMin(c);
        long sum = 0;

        for (int i = 0; i < h; i++)
        {
            str = Console.ReadLine().Split(' ');
            for (int j = 0; j < w; j++)
            {
                if (int.Parse(str[j]) != -1)
                {
                    sum += b[8, int.Parse(str[j]), 1];
                }
            }
        }
        Console.WriteLine(sum);
    }
Example #3
0
        /// <summary>
        /// Render an ascii map of stored data rooms around a specific radius
        /// </summary>
        /// <param name="room">the room to render the radius around</param>
        /// <param name="radius">the radius around the room to render</param>
        /// <param name="forAdmin">include edit links for paths and rooms?</param>
        /// <param name="withPathways">include paths at all?</param>
        /// <returns>a single string that is an ascii map</returns>
        public static string RenderRadiusMap(IRoomTemplate room, int radius, bool visibleOnly = false, bool forAdmin = true, bool withPathways = true, ILocaleTemplate locale = null, MapRenderMode renderMode = MapRenderMode.Normal)
        {
            StringBuilder asciiMap = new StringBuilder();

            //Why?
            if (room == null)
            {
                //Don't show "add room" to non admins, if we're not requesting this for a locale and if the locale has actual rooms
                if (!forAdmin || locale == null || locale.Rooms().Count() > 0)
                {
                    return(string.Empty);
                }

                return(string.Format("<a href='#' class='addData pathway AdminAddInitialRoom' localeId='{0}' title='New Room'>Add Initial Room</a>", locale.Id));
            }

            //1. Get world map
            ILocaleTemplate ourLocale = room.ParentLocation;

            //2. Get slice of room from world map
            long[,,] map = Cartographer.TakeSliceOfMap(new Tuple <int, int>(Math.Max(room.Coordinates.X - radius, 0), room.Coordinates.X + radius)
                                                       , new Tuple <int, int>(Math.Max(room.Coordinates.Y - radius, 0), room.Coordinates.Y + radius)
                                                       , new Tuple <int, int>(Math.Max(room.Coordinates.Z - 1, 0), room.Coordinates.Z + 1)
                                                       , ourLocale.Interior.CoordinatePlane, true);

            //3. Flatten the map
            long[,] flattenedMap = Cartographer.GetSinglePlane(map, room.Coordinates.Z);

            //4. Render slice of room
            return(RenderMap(flattenedMap, visibleOnly, forAdmin, withPathways, room, renderMode));
        }
Example #4
0
        private static void RunIteration(long[,,] times, int n, int sizeIdx, int iteration, int workloadSize)
        {
            var watch         = new Stopwatch();
            var familiesModel = FamiliesGenerator.GenerateFamilies(n);
            var startRule     = families2Persons.SynchronizationRule <Families2Persons.Model2ModelMainRule>();

            var inputBatchModelContainer  = new InputModelContainer(CopyFamilyModel(familiesModel));
            var outputBatchModelContainer = new OutputModelContainer(new Model());

            watch.Start();
            families2Persons.Synchronize(startRule, ref inputBatchModelContainer, ref outputBatchModelContainer, SynchronizationDirection.LeftToRight, ChangePropagationMode.None);
            watch.Stop();
            times[sizeIdx, iteration, 0] = watch.Elapsed.Ticks * 100;

            var inputIncModelContainer  = new InputModelContainer(CopyFamilyModel(familiesModel));
            var outputIncModelContainer = new OutputModelContainer(new Model());

            watch.Restart();
            families2Persons.Synchronize(startRule, ref inputIncModelContainer, ref outputIncModelContainer, SynchronizationDirection.LeftToRight, ChangePropagationMode.OneWay);
            watch.Stop();
            times[sizeIdx, iteration, 1] = watch.Elapsed.Ticks * 100;

            var workload = FamiliesGenerator.GenerateChangeWorkload(familiesModel, workloadSize);

            PlayBatchNet(times, sizeIdx, iteration, startRule, watch, ref inputBatchModelContainer, ref outputBatchModelContainer, workload);
            PlayIncremental(times, sizeIdx, iteration, watch, inputIncModelContainer, workload);
            PlayChangesOnly(times, sizeIdx, iteration, watch, CopyFamilyModel(familiesModel), workload);

            var inputModelContainer  = new InputModelContainer(CopyFamilyModel(familiesModel));
            var outputModelContainer = new OutputModelContainer(new Model());

            CreateModelsForAtlTransformation(n, iteration, workload, startRule, inputModelContainer, outputModelContainer);
        }
Example #5
0
        private static void FillRoomDimensions(long[,,] coordinatePlane)
        {
            if (coordinatePlane == null)
            {
                return;
            }

            int x, y, z;

            for (x = 0; x <= coordinatePlane.GetUpperBound(0); x++)
            {
                for (y = 0; y <= coordinatePlane.GetUpperBound(1); y++)
                {
                    for (z = 0; z <= coordinatePlane.GetUpperBound(2); z++)
                    {
                        if (coordinatePlane[x, y, z] < 0)
                        {
                            continue;
                        }

                        IRoomTemplate room = TemplateCache.Get <IRoomTemplate>(coordinatePlane[x, y, z]);

                        if (room == null)
                        {
                            continue;
                        }

                        room.Coordinates = new Coordinate(x, y, z);
                    }
                }
            }
        }
Example #6
0
        private static long[,,] ShrinkMap(long[,,] fullMap, int xLowest, int yLowest, int zLowest, Tuple <int, int> xBounds, Tuple <int, int> yBounds, Tuple <int, int> zBounds)
        {
            //Maps were the same size
            if (xLowest <= 0 && yLowest <= 0 && zLowest <= 0)
            {
                return(fullMap);
            }

            long[,,] shrunkMap = new long[fullMap.GetUpperBound(0) + 1 - xLowest, fullMap.GetUpperBound(1) + 1 - yLowest, fullMap.GetUpperBound(2) + 1 - zLowest];
            shrunkMap.Populate(-1);

            int x, y, z;

            for (x = 0; x <= shrunkMap.GetUpperBound(0); x++)
            {
                if (x <= xBounds.Item2 && x >= xBounds.Item1)
                {
                    for (y = 0; y <= shrunkMap.GetUpperBound(1); y++)
                    {
                        if (y <= yBounds.Item2 && y >= yBounds.Item1)
                        {
                            for (z = 0; z <= shrunkMap.GetUpperBound(2); z++)
                            {
                                shrunkMap[x, y, z] = fullMap[x + xLowest, y + yLowest, z + zLowest];
                            }
                        }
                    }
                }
            }

            return(shrunkMap);
        }
Example #7
0
        /// <summary>
        /// Splits the cube in a given color direction at its minimum.
        /// </summary>
        private static long Bottom(WuColorCube cube, int direction, long[,,] moment)
        {
            switch (direction)
            {
            case RED:
                return(-moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMaximum] +
                       moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMinimum] +
                       moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMaximum] -
                       moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMinimum]);

            case GREEN:
                return(-moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMaximum] +
                       moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMinimum] +
                       moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMaximum] -
                       moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMinimum]);

            case BLUE:
                return(-moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMinimum] +
                       moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMinimum] +
                       moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMinimum] -
                       moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMinimum]);

            default:
                return(0);
            }
        }
        private static void PlayIncremental(long[,,] times, int n, int sizeIdx, int iteration, Stopwatch watch, InputModelContainer inputModelContainer, OutputModelContainer outputModelContainer, List <MakeWorkloadAction> workload)
        {
            var outputRepository = new ModelRepository();

            Directory.CreateDirectory("makeOutputModelsIncSync");
            Directory.CreateDirectory("makeOutputModelsIncSync\\" + n);
            Directory.CreateDirectory("makeOutputModelsIncSync\\" + n + "\\" + iteration);

            Make2Ant.InputModelContainer  = inputModelContainer;
            Make2Ant.OutputModelContainer = outputModelContainer;

            watch.Restart();
            for (int index = 0; index < workload.Count; index++)
            {
                var item = workload[index];
                item.Perform(inputModelContainer.IN);
                var tempRepo = new ModelRepository();
                tempRepo.Resolve("makeInputModelsSync\\" + n + "\\" + iteration + "\\" + "inputModel" + index + ".xmi");
                outputRepository.Save(outputModelContainer.OUT, "makeOutputModelsIncSync\\" + n + "\\" + iteration + "\\" + "outputModel" + index + ".xmi");
            }

            watch.Stop();

            Directory.Delete("makeOutputModelsIncSync", true);

            times[sizeIdx, iteration, 3] = watch.Elapsed.Ticks * 100;
        }
        private static void PlayBatchNet(long[,,] times, int n, int sizeIdx, int iteration, Make2Ant.Model2ModelMainRule startRule, Stopwatch watch, ref InputModelContainer inputModelContainer, ref OutputModelContainer outputModelContainer, List <MakeWorkloadAction> workload)
        {
            var outputRepository = new ModelRepository();

            Directory.CreateDirectory("makeOutputModelsBatchSync");
            Directory.CreateDirectory("makeOutputModelsBatchSync\\" + n);
            Directory.CreateDirectory("makeOutputModelsBatchSync\\" + n + "\\" + iteration);

            Make2Ant.InputModelContainer  = inputModelContainer;
            Make2Ant.OutputModelContainer = outputModelContainer;

            watch.Restart();
            for (int index = 0; index < workload.Count; index++)
            {
                var item = workload[index];
                item.Perform(inputModelContainer.IN);

                outputModelContainer = new OutputModelContainer(new Model());
                RerunBatchSynchronization(startRule, ref inputModelContainer, ref outputModelContainer);
                var tempRepo = new ModelRepository();
                tempRepo.Resolve("makeInputModelsSync\\" + n + "\\" + iteration + "\\" + "outputModel" + index + ".xmi");
                outputRepository.Save(outputModelContainer.OUT, "makeOutputModelsBatchSync\\" + n + "\\" + iteration + "\\" + "outputModel" + index + ".xmi");
            }
            watch.Stop();

            Directory.Delete("makeOutputModelsBatchSync", true);

            times[sizeIdx, iteration, 2] = watch.Elapsed.Ticks * 100;
        }
Example #10
0
        /// <summary>
        ///     Splits the cube in given position, and color direction.
        /// </summary>
        private static long Top(WuColorCube cube, int direction, int position, long[,,] moment)
        {
            switch (direction)
            {
            case Red:
                return(moment[position, cube.GreenMaximum, cube.BlueMaximum] -
                       moment[position, cube.GreenMaximum, cube.BlueMinimum] -
                       moment[position, cube.GreenMinimum, cube.BlueMaximum] +
                       moment[position, cube.GreenMinimum, cube.BlueMinimum]);

            case Green:
                return(moment[cube.RedMaximum, position, cube.BlueMaximum] -
                       moment[cube.RedMaximum, position, cube.BlueMinimum] -
                       moment[cube.RedMinimum, position, cube.BlueMaximum] +
                       moment[cube.RedMinimum, position, cube.BlueMinimum]);

            case Blue:
                return(moment[cube.RedMaximum, cube.GreenMaximum, position] -
                       moment[cube.RedMaximum, cube.GreenMinimum, position] -
                       moment[cube.RedMinimum, cube.GreenMaximum, position] +
                       moment[cube.RedMinimum, cube.GreenMinimum, position]);

            default:
                return(0);
            }
        }
Example #11
0
 void Solve()
 {
     io.i(out N, out A);
     io.ini(out x, N);
     dp = new long[N + 1, N + 1, N * 50 + 1];
     dp.Set(-1);
     io.o(f(0, 0, 0));
 }
Example #12
0
 /// <summary>
 /// Shrinks a map matrix to its exact needed coordinate bounds
 /// </summary>
 /// <param name="map"></param>
 /// <returns></returns>
 public static long[,,] ShrinkMap(long[,,] map)
 {
     //We take a "full slice" of the map to shrink it
     return(TakeSliceOfMap(new Tuple <int, int>(map.GetLowerBound(0), map.GetUpperBound(0))
                           , new Tuple <int, int>(map.GetLowerBound(1), map.GetUpperBound(1))
                           , new Tuple <int, int>(map.GetLowerBound(2), map.GetUpperBound(2))
                           , map, true));
 }
Example #13
0
 private RespuestaGeneral ResolverOperacionesMatriz(long[,,] matriz, ArregloCubo cubo, RespuestaGeneral respuestaGeneral)
 {
     if (!respuestaGeneral.EstadoOperacion)
     {
         return(respuestaGeneral);
     }
     return(ResolverOperaciones(cubo, matriz));
 }
 public RespuestaGeneral EjecutarUpdate(OperacionCubo operacion, long[,,] matriz)
 {
     respuestaGeneral = validacionDatos.ValidarOperacionUpdate(operacion.InformacionOperacion, ref respuestaGeneral);
     if (respuestaGeneral.EstadoOperacion)
     {
         ActualizarValor(operacion.InformacionOperacion, matriz);
     }
     return(respuestaGeneral);
 }
Example #15
0
 public RespuestaGeneral ProcesarOperacionUpdate(OperacionCubo operacion, long[,,] matriz, ref RespuestaGeneral respuestaGeneral)
 {
     respuestaGeneral = ValidarOperacionUpdate(operacion.InformacionOperacion, ref respuestaGeneral);
     if (respuestaGeneral.Estado)
     {
         ActualizarValor(operacion.InformacionOperacion, matriz);
     }
     return(respuestaGeneral);
 }
Example #16
0
 public RespuestaGeneral ProcesarOperacionQuery(OperacionCubo operacion, long[,,] matriz, ref RespuestaGeneral respuestaGeneral)
 {
     respuestaGeneral = ValidarOperacionQuery(operacion.InformacionOperacion, ref respuestaGeneral);
     if (!respuestaGeneral.Estado)
     {
         return(respuestaGeneral);
     }
     return(SumarValor(operacion.InformacionOperacion, matriz, ref respuestaGeneral));
 }
Example #17
0
        private void ActualizarValor(long[] infoOperacion, long[,,] matriz)
        {
            long x = infoOperacion[0] - 1;
            long y = infoOperacion[1] - 1;
            long z = infoOperacion[2] - 1;
            long valorActualizacion = infoOperacion[3];

            matriz[x, y, z] = valorActualizacion;
        }
Example #18
0
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            var reader = new StreamReader("b.txt");
            var writer = new StreamWriter("b_out.txt");

            dp    = new long[16, 2000, 16];
            price = new long[16, 2000];
            left  = new long[2000];

            var testNumber = long.Parse(reader.ReadLine());

            for (long test = 1; test <= testNumber; ++test)
            {
                var p = long.Parse(reader.ReadLine());

                for (int i = 0; i < 16; ++i)
                {
                    for (int j = 0; j < 2000; ++j)
                    {
                        for (int l = 0; l < 16; ++l)
                        {
                            dp[i, j, l] = -1;
                        }
                    }
                }

                long count = 1;
                for (int i = 0; i < p; ++i)
                {
                    count *= 2;
                }

                string[] input = reader.ReadLine().Split(' ');
                for (int i = 0; i < count; ++i)
                {
                    left[i] = p - long.Parse(input[i]);
                }

                for (int i = 1; i <= p; ++i)
                {
                    count /= 2;
                    input  = reader.ReadLine().Split(' ');
                    for (int j = 1; j <= count; ++j)
                    {
                        price[i, j] = long.Parse(input[j - 1]);
                    }
                }

                long result = Memo(p, 1, 0);
                writer.WriteLine("Case #{0}: {1}", test, result);
            }

            reader.Close();
            writer.Close();
        }
Example #19
0
 public Solution(int dimensions)
 {
     if (dimensions == 0)
     {
         return;
     }
     this.dimensions = dimensions;
     tree            = new long[dimensions + 1, dimensions + 1, dimensions + 1];
     nums            = new long[dimensions, dimensions, dimensions];
 }
 public PopulationGrowth(DateTime StartDate, DateTime EndDate)
 {
     startDate = StartDate;
     endDate   = EndDate;
     StartYear = startDate.Year;
     EndYear   = endDate.Year;
     size      = EndYear - StartYear;
     sizeAge   = 140;
     Data      = new long[2, size + 1, sizeAge];
 }
Example #21
0
        private String recursiveReportPath(Point startPoint, long[,,] minPathArray)
        {
            Point previousPoint = new Point((int)minPathArray[startPoint.X, startPoint.Y, 2], (int)minPathArray[startPoint.X, startPoint.Y, 3]);

            if (startPoint.X == 0)
            {
                return("" + minPathArray[startPoint.X, startPoint.Y, 0]);
            }
            return(recursiveReportPath(previousPoint, minPathArray) + " -> " + minPathArray[startPoint.X, startPoint.Y, 0]);
        }
Example #22
0
        private static bool isInMatrix(long[,,] matrix, long dimension)
        {
            bool result = dimension >= 0 &&
                          dimension <= matrix.GetLength(0) &&
                          dimension <= matrix.GetLength(1) &&
                          dimension <= matrix.GetLength(2) &&
                          dimension >= 0;

            return(result);
        }
 public RespuestaGeneral EjecutarQuery(OperacionCubo operacion, long[,,] matriz)
 {
     respuestaGeneral = validacionDatos.ValidarOperacionQuery(operacion.InformacionOperacion, ref respuestaGeneral);
     if (!respuestaGeneral.EstadoOperacion)
     {
         return(respuestaGeneral);
     }
     AcumularValores(operacion.InformacionOperacion, matriz);
     return(respuestaGeneral);
 }
Example #24
0
        private long recursiveMinSumDown(Point distanceTo, long[,,] minPathMatrix, long[,] matrix) //this will keep looking further down and to the left, deciding whether down or left is better for each
        {
            long leftSum = minPathMatrix[distanceTo.X - 1, distanceTo.Y, 1];                       //left sum is always previously calculated, so we just need to find out what it is
            long downSum = long.MaxValue;

            if (isValid(new Point(distanceTo.X, distanceTo.Y - 1), matrix))                                      //if moving down isn't valid, then it will remain at long.MaxValue
            {
                downSum = recursiveMinSumDown(new Point(distanceTo.X, distanceTo.Y - 1), minPathMatrix, matrix); //recursive call
            }
            return(minPathMatrix[distanceTo.X, distanceTo.Y, 0] + ((leftSum < downSum) ? leftSum : downSum));    //return itself + the sum of the path to get to itself
        }
Example #25
0
 public static void Print(long[,,] k){
     for(int i=0;i<k.GetLength(0);i++){
         for(int j=0;j<k.GetLength(1);j++){
             for(int l=0;l<k.GetLength(2);l++){
                 Console.Write(k[i,j,l]+" ");
             }
             Console.WriteLine();
         }
         Console.WriteLine();
     }
 }
Example #26
0
 /// <summary>
 /// Computes the volume of the cube in a specific moment.
 /// </summary>
 private static long Volume(WuColorCube cube, long[,,] moment)
 {
     return(moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMaximum] -
            moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMinimum] -
            moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMaximum] +
            moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMinimum] -
            moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMaximum] +
            moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMinimum] +
            moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMaximum] -
            moment[cube.RedMinimum, cube.GreenMinimum, cube.BlueMinimum]);
 }
Example #27
0
        private static void PlayChangesOnly(long[,,] times, int sizeIdx, int iteration, Stopwatch watch, Model inputModel, List <FamilyWorkloadAction> workload)
        {
            watch.Restart();
            foreach (var item in workload)
            {
                item.Perform(inputModel);
            }
            watch.Stop();

            times[sizeIdx, iteration, 4] = watch.Elapsed.Ticks * 100;
        }
Example #28
0
        private static void PlayIncremental(long[,,] times, int sizeIdx, int iteration, Stopwatch watch, InputModelContainer inputModelContainer, List <FamilyWorkloadAction> workload)
        {
            watch.Restart();
            foreach (var item in workload)
            {
                item.Perform(inputModelContainer.IN);
            }
            watch.Stop();

            times[sizeIdx, iteration, 3] = watch.Elapsed.Ticks * 100;
        }
Example #29
0
        public long[,] NoCalls; // 2D array stores knownCN and REF ploidy for bases where there are no calls


        public BaseCounter(int maxCn, int minSize, int maxSize, bool hasRoi = false)
        {
            MinSize   = minSize;
            MaxSize   = maxSize;
            BaseCount = new long[maxCn + 1, maxCn + 1, 3];
            NoCalls   = new long[maxCn + 1, 3];
            if (hasRoi)
            {
                RoiBaseCount = new long[maxCn + 1, maxCn + 1, 3];
            }
        }
Example #30
0
        private static void PlayBatchNet(long[,,] times, int sizeIdx, int iteration, Families2Persons.Model2ModelMainRule startRule, Stopwatch watch, ref InputModelContainer inputModelContainer, ref OutputModelContainer outputModelContainer, List <FamilyWorkloadAction> workload)
        {
            watch.Restart();
            foreach (var item in workload)
            {
                item.Perform(inputModelContainer.IN);
                RerunBatchSynchronization(startRule, ref inputModelContainer, ref outputModelContainer);
            }
            watch.Stop();

            times[sizeIdx, iteration, 2] = watch.Elapsed.Ticks * 100;
        }
Example #31
0
		public void Close()
		{
			UserData = null;
			C2Count = null;
			if (m_device != null)
				m_device.Close();
			m_device = null;
			_toc = null;
			_toc2 = null;
			gapsDetected = false;
			readCommandFound = false;
			_currentStart = -1;
			_currentEnd = -1;
		}