public RunLog Run(int numOfSteps, int samplingInterval = 0) { PrepareForSimulation(); var log = new RunLog(samplingInterval > 0 ? numOfSteps / samplingInterval : 0); BitWriter trajectoriesWriter = null; FileStream trajectoriesStream = null; if (TrajectoriesLogFileName != null) { trajectoriesStream = new FileStream(TrajectoriesLogFileName, FileMode.Create, FileAccess.Write, FileShare.Read); trajectoriesWriter = new BitWriter(trajectoriesStream); } for (int i = 0; i < numOfSteps; i++) { log.NumOfMoves++; // for debug if (i == breakAtStep) { } var accepted = RunSingleStepInternal(); // Once in a while re-calculate entire energy (steps sum up differences, for speed) if (i % N == 0) { _currentEnergy = CalculateConfigurationEnergy(_configuration); } if (samplingInterval > 0 && i % samplingInterval == 0) { if (ShouldSampleConfigurations) { log.Configurations[i / samplingInterval] = Configuration.ToDoubleArray(); } log.EndToEndDistances[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).Radius; log.EndToEndX[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).x; log.EndToEndY[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).y; log.Energy[i / samplingInterval] = _currentEnergy; log.Accepted[i / samplingInterval] = accepted; // Write trajectories if (trajectoriesWriter != null) { switch (OutputType) { case 0: WriteBinary(trajectoriesWriter, Configuration.ToDoubleArray()); break; case 1: WriteBinaryFixedOutputUnit(trajectoriesWriter, Configuration.ToDoubleArray(), OutputFixedUnit); break; } } } } if (trajectoriesWriter != null) { //if (OutputType == 2) // log.WriteBinaryScaleDecomposedOutput(trajectoriesWriter); trajectoriesWriter.Dispose(); trajectoriesStream.Dispose(); } return(log); }
public FiniteStateMCLog RandomVisits(int numOfSteps) { var log = new FiniteStateMCLog(numOfSteps); var inverseTemp = 1 / T; var stateProbabilities = _stateEnergies.Select(e => Math.Exp(-(e * inverseTemp))).ToArray(); var p = StateEnergies.Divide(T).Negative().Exp(); p = p.Divide(p.Sum()); var cumulativeProbability = p.CumSum(); Stream trajectoriesStream = null; if (OutputStream != null) { trajectoriesStream = OutputStream; } else if (OutputFileName != null) { trajectoriesStream = new FileStream(OutputFileName, FileMode.Create, FileAccess.Write, FileShare.Read); } Action <int> writeFunction; BitWriter bs = null; var numOfBits = (int)Math.Ceiling(Math.Log(StateEnergies.Length, 2.0)); switch (OutputStyle) { case 1: writeFunction = (state => { trajectoriesStream.WriteByte((byte)(1 << state)); }); break; case 2: bs = new BitWriter(trajectoriesStream); writeFunction = (state => { bs.WriteBits((ulong)state, numOfBits); }); break; default: writeFunction = (state => { trajectoriesStream.WriteByte((byte)state); }); break; } for (int stepIndex = 0; stepIndex < numOfSteps; stepIndex++) { var randomNum = _random.NextDouble(); CurrentState = cumulativeProbability.IndexOfFirstGreater(randomNum); _stateVisits[CurrentState]++; log.VisitLog[stepIndex] = CurrentState; // Write trajectories if (trajectoriesStream != null) { writeFunction(CurrentState); } } // Dispose of the stream only if this funcion created it if (trajectoriesStream != null && OutputStream == null) { trajectoriesStream.Dispose(); } double sum = _stateVisits.Sum(); log.MeanOccupancy = _stateVisits.Select(v => v / sum).ToArray(); log.Entropy = -log.MeanOccupancy.Select(m => (m + 1e-16) * Math.Log(m + 1e-16)).Sum(); log.TheoreticalEntropy = -p.MultiplyElements(p.Ln()).Sum(); return(log); }
public RunLog Run(int numOfSteps, int samplingInterval = 0) { if (MaximalMoveInterval > _configuration.Length) { MaximalMoveInterval = _configuration.Length; } if (MinimalMoveInterval < 3) { MinimalMoveInterval = 3; } var log = new RunLog(samplingInterval > 0 ? numOfSteps / samplingInterval : 0); BitWriter trajectoriesWriter = null; FileStream trajectoriesStream = null; if (TrajectoriesLogFileName != null) { trajectoriesStream = new FileStream(TrajectoriesLogFileName, FileMode.Create, FileAccess.Write, FileShare.Read); trajectoriesWriter = new BitWriter(trajectoriesStream); } for (int i = 0; i < numOfSteps; i++) { log.NumOfMoves++; if (i == breakAtStep) { } RunSingleStep(); if (samplingInterval > 0 && i % samplingInterval == 0) { if (ShouldSampleConfigurations) { log.Configurations[i / samplingInterval] = Configuration.ToDoubleArray(); } log.EndToEndDistances[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).Radius; log.EndToEndX[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).x; log.EndToEndY[i / samplingInterval] = (_configuration[N - 1] - _configuration[0]).y; // Write trajectories if (trajectoriesWriter != null) { switch (OutputType) { case 0: WriteBinary(trajectoriesWriter, Configuration.ToDoubleArray()); break; case 1: WriteBinaryFixedOutputUnit(trajectoriesWriter, Configuration.ToDoubleArray(), OutputFixedUnit); break; } } } } if (trajectoriesWriter != null) { //if (OutputType == 2) // log.WriteBinaryScaleDecomposedOutput(trajectoriesWriter); trajectoriesWriter.Dispose(); trajectoriesStream.Dispose(); } return(log); }
public FiniteStateMCLog RunAndLog(int numOfSteps, int intervalBetweenLogEntries) { var numOfLogEntries = numOfSteps / intervalBetweenLogEntries; var log = new FiniteStateMCLog(numOfLogEntries); Stream trajectoriesStream = null; if (OutputStream != null) { trajectoriesStream = OutputStream; } else if (OutputFileName != null) { trajectoriesStream = new FileStream(OutputFileName, FileMode.Create, FileAccess.Write, FileShare.Read); } Action <int> writeFunction; BitWriter bs = null; var numOfBits = (int)Math.Ceiling(Math.Log(StateEnergies.Length, 2.0)); switch (OutputStyle) { case 1: writeFunction = (state => { trajectoriesStream.WriteByte((byte)(1 << state)); }); break; case 2: bs = new BitWriter(trajectoriesStream); writeFunction = (state => { bs.WriteBits((ulong)state, numOfBits); }); break; default: writeFunction = (state => { trajectoriesStream.WriteByte((byte)state); }); break; } for (int stepIndex = 0; stepIndex < numOfSteps; stepIndex++) { var nextState = _random.Next(_stateEnergies.Length); var shouldAccept = (_stateEnergies[CurrentState] > _stateEnergies[nextState]) || (_random.NextDouble() < Math.Exp((_stateEnergies[CurrentState] - _stateEnergies[nextState]) / T)); if (shouldAccept) { CurrentState = nextState; } if (stepIndex % intervalBetweenLogEntries == 0) { _stateVisits[CurrentState]++; log.VisitLog[stepIndex / intervalBetweenLogEntries] = CurrentState; // Write trajectories if (trajectoriesStream != null) { writeFunction(CurrentState); } } } // Dispose of the stream only if this funcion created it if (trajectoriesStream != null && OutputStream == null) { trajectoriesStream.Dispose(); } double sum = _stateVisits.Sum(); log.MeanOccupancy = _stateVisits.Select(v => v / sum).ToArray(); log.Entropy = -log.MeanOccupancy.Select(m => (m + 1e-16) * Math.Log(m + 1e-16)).Sum(); var p = StateEnergies.Divide(T).Negative().Exp(); p = p.Divide(p.Sum()); log.TheoreticalEntropy = -p.MultiplyElements(p.Ln()).Sum(); return(log); }