public void ValidateStates() { var enumerator = ProbabilityMatrix.GetEnumerator(); //every row contains one probability distribution (also the initial distribution) while (enumerator.MoveNextRow()) { // for each state there is a row. The sum of all columns in a row should be 1.0 var probability = 0.0; while (enumerator.MoveNextColumn()) { if (enumerator.CurrentColumnValue != null) { probability += enumerator.CurrentColumnValue.Value.Value; } else { throw new Exception("Entry must not be null"); } } if (!Probability.IsOne(probability, 0.000000001)) { throw new Exception("Probabilities should sum up to 1"); } } }
private int ColumnToState(int state) => state; //Do nothing! Just here to make the algorithms more clear. // Creating matrix phase // For the initial distribution the process is // StartWithInitialDistribution() // while(transitions to add exist) { // AddInitialTransition(); // } // FinishInitialDistribution() internal void StartWithInitialDistribution() { ProbabilityMatrix.SetRow(RowOfInitialStates); }
public void SealProbabilityMatrix() { ProbabilityMatrix.OptimizeAndSeal(); }
internal void FinishDistribution() { ProbabilityMatrix.FinishRow(); }
internal void AddTransition(int markovChainState, double probability) { ProbabilityMatrix.AddColumnValueToCurrentRow(new SparseDoubleMatrix.ColumnValue(StateToColumn(markovChainState), probability)); Transitions++; }
// For distribution of a state the process is // StartWithNewDistribution(markovChainSourceState) // while(transitions to add exist) { // AddTransition(); // } // FinishDistribution() internal void StartWithNewDistribution(int markovChainSourceState) { ProbabilityMatrix.SetRow(StateToRow(markovChainSourceState)); }
internal void AddInitialTransition(int markovChainState, double probability) { // initial state probabilities are also saved in the ProbabilityMatrix ProbabilityMatrix.AddColumnValueToCurrentRow(new SparseDoubleMatrix.ColumnValue(StateToColumn(markovChainState), probability)); InitialTransitions++; }
private void makePrediction(PointQ currentCoordinate, PointQ previousCoordinate, List <PointQ> allEndPoints) { foreach (PointQ endPoint in allEndPoints) { Double previous_distance = GetDistance(previousCoordinate, endPoint); Double current_distance = GetDistance(currentCoordinate, endPoint); //distance to endpoint is increasing which means that the pedestrian is moving away from this point and therefore moving towards another direction if (current_distance > previous_distance) { //rule out this destination/Path ProbabilityMatrix pM = new ProbabilityMatrix(endPoint, false); listProbabilityMatrix.Add(pM); } //if distance is decreasing towards a certain endpoint this means that pedestrian is moving near to that endpoint else { ProbabilityMatrix pM = new ProbabilityMatrix(endPoint, true); listProbabilityMatrix.Add(pM); } } foreach (ProbabilityMatrix pM in listProbabilityMatrix) { //Add valid paths for calculating probabilty if (pM.isValid == true) { probabilityCount += 1; validDestination.Add(pM.allEndPoints); } else { //Dont include in calculating probabilty } } //Total number of Paths/Routes => 6 in our case double totalnumberofendpoints = allEndPoints.Count(); // total number of valid endpoints => 3 in our case double totalnumberofValidDestinations = validDestination.Count(); foreach (PointQ p in validDestination) { double probability = (1 / totalnumberofValidDestinations) * 100.00; Console.WriteLine("The probability of pedestrian reaching the point (" + p.X + ", " + p.Y + ") is :" + probability.ToString()); //Write Probability of Pedestrian of Valid paths in CSV file using (FileStream fs = new FileStream("Ped.csv", FileMode.Append, FileAccess.Write)) { StreamWriter sw = new StreamWriter(fs); sw.Write("The probability of pedestrian reaching the point (" + p.X + ", " + p.Y + ") is :" + probability.ToString()); sw.Close(); } } }