private void visitPath(ExercisePath path)
    {
        //Adding the step to the solution
        ExerciseStep step = new ExerciseStep(getPinContainingRing(path.from), path.destination, path.from, solution.Count + 1);

        solution.Add(step);
        path.from.step = step.index;

        //Changing the exercise status
        step.from.ringPop();        //Remove the node from the current pin

        //Are we moving the biggest ring? (it is only moved once)
        if (step.ring.size == biggestRing.size)
        {
            solutionPinIndex   = step.to.index;
            step.ring.isSolved = true;
        }
        //is this the final position for the ring?
        else if (step.to.index == solutionPinIndex)
        {
            RingNode rn = step.to.ringPeek();
            if (rn.isSolved && rn.size == step.ring.size + 1)
            {
                step.ring.isSolved = true;
            }
        }

        step.to.ringPush(step.ring);        //Adding the ring to the destination

        //Erase pending paths from the previous step
        if (solution.Count > 1)
        {
            solution[solution.Count - 2].ring.emptyPendingPaths();
        }
    }
Example #2
0
        /// <summary>
        /// Evaluate an exercise step
        /// </summary>
        /// <param name="exerciseStep">The performed step</param>
        /// <param name="idealExerciseStep">Optional, required if no training set was provided</param>
        /// <returns></returns>
        public EvaluationResults EvaluateExerciseStep(ExerciseStep exerciseStep, ExerciseStep idealExerciseStep = null)
        {
            bool niceWork = true;

            ArticolationError[] stepEvaluationResults = _exerciseEvaluator.EvaluateExerciseStep(ExerciseTollerance, exerciseStep, idealExerciseStep);
            if (ExerciseTollerance != null)
            {
                for (int i = 0; i < stepEvaluationResults.Length; i++)
                {
                    ArticolationError error = stepEvaluationResults[i];
                    niceWork &= error.Position.IsMagnitudeCorrect && error.Position.IsSpeedCorrect &&
                                error.Angle.IsSpeedCorrect && error.Angle.IsMagnitudeCorrect;
                }
            }

            return(new EvaluationResults(niceWork, stepEvaluationResults));
        }
Example #3
0
        private async Task CreateSteps(ExerciseBody exerciseBody, Exercise newExercise)
        {
            // delete old
            await exerciseRepository.DeleteStepsAsync(newExercise.Id);

            // create new
            newExercise.ExerciseSteps = new List <ExerciseStep>();
            int stepCount = 1;

            foreach (string step in exerciseBody.Steps)
            {
                ExerciseStep newStep = new ExerciseStep
                {
                    Exercise        = newExercise,
                    StepNumber      = stepCount,
                    StepDescription = step
                };
                newExercise.ExerciseSteps.Add(newStep);
                stepCount++;
            }
        }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tollerances"></param>
        /// <param name="currentStep"></param>
        /// <param name="idealExerciseStep"></param>
        /// <returns></returns>
        public ArticolationError[] EvaluateExerciseStep(ArticolationTollerance[] tollerances, ExerciseStep currentStep, ExerciseStep idealExerciseStep = null)
        {
            // check abiity to evaluate the step
            if (_isRealTimeSampling && idealExerciseStep == null)
            {
                throw new Exception("Unable to evaluate exercise step without ideal sample or a training set!");
            }

            PerformedMovementSteps.Add(currentStep);

            // eventually keep training the ai (doing this all the following code is the same in both cases)
            if (idealExerciseStep != null)
            {
                _trainingSet.idealMovementSteps.Add(idealExerciseStep);
            }

            ExerciseStep previousStep      = GetPerformedStep(-1),
                         currentIdealStep  = GetIdealStep(0),
                         previousIdealStep = GetIdealStep(-1);

            if (currentIdealStep == null)
            {
                int lastStepIndex = _trainingSet.idealMovementSteps.Count - 1;
                currentIdealStep  = _trainingSet.idealMovementSteps[lastStepIndex];
                previousIdealStep = _trainingSet.idealMovementSteps[lastStepIndex - 1];
            }

            List <ArticolationError> articolationErrors                 = new List <ArticolationError>();
            ArticolationPoint        currentStepArticolationPoint       = currentStep.Root,
                                     previousStepArticolationPoint      = previousStep == null ? null : previousStep.Root,
                                     currentStepIdealArticolationPoint  = currentIdealStep.Root,
                                     previousStepIdealArticolationPoint = previousIdealStep == null ? null : previousIdealStep.Root;
            int i = 0;

            while (currentStepArticolationPoint != null)
            {
                ArticolationError      articolationError = new ArticolationError();
                ArticolationTollerance tollerance        = tollerances[i++];

                articolationError.Position.Magnitude = currentStepIdealArticolationPoint.Position - currentStepArticolationPoint.Position;

                Debug.Log("Articolation [" + i + "]");
                Debug.Log("ideal position (" +
                          currentStepIdealArticolationPoint.Position.x + ", " + currentStepIdealArticolationPoint.Position.y + ", " + currentStepIdealArticolationPoint.Position.z + ")"
                          );
                Debug.Log("real position (" +
                          currentStepArticolationPoint.Position.x + ", " + currentStepArticolationPoint.Position.y + ", " + currentStepArticolationPoint.Position.z + ")"
                          );

                articolationError.Position.IsMagnitudeCorrect = articolationError.Position.Magnitude.magnitude < tollerance.positionTolleranceRadius;

                articolationError.Angle.Magnitude          = currentStepIdealArticolationPoint.Angle - currentStepArticolationPoint.Angle;
                articolationError.Angle.IsMagnitudeCorrect = articolationError.Angle.Magnitude.magnitude < tollerance.rotationTolleranceRadius;

                CalculateSpeedErrors(articolationError, currentStepArticolationPoint, previousStepArticolationPoint, currentStepIdealArticolationPoint, previousStepIdealArticolationPoint);
                articolationError.Position.IsSpeedCorrect = articolationError.Position.Speed.magnitude < tollerance.positionSpeedTolleranceRadius;
                articolationError.Angle.IsSpeedCorrect    = articolationError.Angle.Speed.magnitude < tollerance.positionSpeedTolleranceRadius;

                articolationErrors.Add(articolationError);

                currentStepArticolationPoint       = currentStepArticolationPoint.Substaining;
                previousStepArticolationPoint      = previousStepArticolationPoint == null ? null : previousStepArticolationPoint.Substaining;
                currentStepIdealArticolationPoint  = currentStepIdealArticolationPoint.Substaining;
                previousStepIdealArticolationPoint = previousStepIdealArticolationPoint == null ? null : previousStepIdealArticolationPoint.Substaining;
            }
            return(articolationErrors.ToArray());
        }
Example #5
0
        protected override void Seed(FitotrackContext context)
        {
            base.Seed(context);

            #region __SQL Queries__

            #region _Triggers_

            #region __ExerciseMusclesDelete__
            //// Проверяем есть ли триггер удаления с именем 'DeleteExerciseMusclesCascadeTrig'.
            //// Если есть - удаляем его.
            //context.Database.ExecuteSqlCommand("IF EXISTS " +
            //                                    "(SELECT * FROM sys.objects " +
            //                                    "WHERE [type] = 'TR' " +
            //                                        "AND [name] = 'DeleteExerciseMusclesCascadeTrig') " +
            //                                    "DROP TRIGGER DeleteExerciseMusclesCascadeTrig;");

            //// Создаем триггер удаления 'DeleteExerciseMusclesCascadeTrig',
            //// который будет удалять все ExerciseMuscles записи, связанные с Exercise.
            //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteExerciseMusclesCascadeTrig " +
            //                                        "ON [dbo].[Exercises] " +
            //                                        "FOR DELETE " +
            //                                    "AS " +
            //                                        "DELETE [dbo].[ExerciseMuscles] " +
            //                                        "FROM [dbo].[ExerciseMuscles], deleted " +
            //                                        "WHERE [dbo].[ExerciseMuscles].[ExerciseMusclesId] = deleted.MainMusclesId " +
            //                                            "OR [dbo].[ExerciseMuscles].[ExerciseMusclesId] = deleted.OtherMusclesId");
            #endregion

            #region __FoodDiaryEntriesDelete__
            //// Проверяем есть ли триггер удаления с именем 'DeleteFoodDiaryEntriesCascadeTrig'.
            //// Если есть - удаляем его.
            //context.Database.ExecuteSqlCommand("IF EXISTS " +
            //                                    "(SELECT * FROM sys.objects " +
            //                                    "WHERE [type] = 'TR' " +
            //                                        "AND [name] = 'DeleteFoodDiaryEntriesCascadeTrig') " +
            //                                    "DROP TRIGGER DeleteFoodDiaryEntriesCascadeTrig;");
            //// Создаем триггер удаления 'DeleteFoodDiaryEntriesCascadeTrig',
            //// который будет удалять все FoodDiaryEntry записи, связанные с UserProfile.
            //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteFoodDiaryEntriesCascadeTrig " +
            //                                        "ON [dbo].[UserProfiles] " +
            //                                        "FOR DELETE " +
            //                                    "AS " +
            //                                        "DELETE [dbo].[FoodDiaryEntries] " +
            //                                        "FROM [dbo].[FoodDiaryEntries], deleted " +
            //                                        "WHERE [dbo].[FoodDiaryEntries].[CreateUserId] = deleted.UserId ");
            #endregion

            #region __WorkoutDiaryEntriesDelete__
            //// Проверяем есть ли триггер удаления с именем 'DeleteWorkoutDiaryEntriesCascadeTrig'.
            //// Если есть - удаляем его.
            //context.Database.ExecuteSqlCommand("IF EXISTS " +
            //                                    "(SELECT * FROM sys.objects " +
            //                                    "WHERE [type] = 'TR' " +
            //                                        "AND [name] = 'DeleteWorkoutDiaryEntriesCascadeTrig') " +
            //                                    "DROP TRIGGER DeleteWorkoutDiaryEntriesCascadeTrig;");
            //// Создаем триггер удаления 'DeleteWorkoutDiaryEntriesCascadeTrig',
            //// который будет удалять все WorkoutDiaryEntry записи, связанные с UserProfile.
            //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteWorkoutDiaryEntriesCascadeTrig " +
            //                                        "ON [dbo].[UserProfiles] " +
            //                                        "FOR DELETE " +
            //                                    "AS " +
            //                                        "DELETE [dbo].[WorkoutDiaryEntries] " +
            //                                        "FROM [dbo].[WorkoutDiaryEntries], deleted " +
            //                                        "WHERE [dbo].[WorkoutDiaryEntries].[CreateUserId] = deleted.UserId ");
            #endregion
            #endregion

            #endregion

#if DEBUG
            //if (System.Diagnostics.Debugger.IsAttached == false)
            //    System.Diagnostics.Debugger.Launch();

            #region __Заполняем пользователей__

            var UserManager = new UserManager <ApplicationUser, int>(new CustomUserStore(context));
            var user        = new ApplicationUser();
            user.UserName = "******";
            user.Email    = "*****@*****.**";
            string password = "******";
            user.UserProfile = new UserProfile
            {
                FullName      = "Dmitry Tut",
                DateOfBirth   = new DateTime(1988, 5, 14),
                Gender        = 1,
                Height        = 184,
                ActivityLevel = 3,
                Location      = "Moscow",
                Weights       =
                {
                    new UserWeight {
                        Date = DateTime.Now, Weight = 80
                    }
                }
            };
            var duplicate = UserManager.FindByEmail(user.Email);
            if (duplicate != null)
            {
                UserManager.Delete(duplicate);
            }
            var result = UserManager.Create(user, password);
            if (!result.Succeeded)
            {
                throw new Exception(result.Errors.ElementAt(0));
            }
            user = UserManager.FindByEmail(user.Email);
            if (user == null)
            {
                throw new Exception("User object is null.");
            }
            //user = UserManager.FindById(user);
            //context.UserProfiles.AddOrUpdate(userProfile);
            #endregion

            #region __Заполняем упражнения__
            ExerciseStep[] steps =
            {
                new ExerciseStep {
                    Description = "Step1 description",
                    Order       = 0
                },
                new ExerciseStep {
                    Description = "Step2 description",
                    Order       = 1
                }
            };

            var muscles = new List <ExerciseMuscles> {
                new ExerciseMuscles {
                    Title = "Back"
                },
                new ExerciseMuscles {
                    Title = "Shoulders"
                }
            };

            context.Muscles.AddOrUpdate(muscles[0]);
            context.Muscles.AddOrUpdate(muscles[1]);

            var exercise = new Exercise
            {
                Title       = "Exercise 1",
                Description = "Exercise Description 1",
                Steps       = steps.ToList(),
                MainMuscles = muscles,
                //OtherMuscles = new List<ExerciseMuscles>{
                //    new ExerciseMuscles {
                //        Title = "Abs"
                //    },
                //    new ExerciseMuscles {
                //        Title = "Calves"
                //    }
                //},
                Type       = (int)ExerciseTypes.Strength,
                Complexity = (int)ExerciseComplexity.BeginningLevel,
                Mechanics  = (int)ExerciseMechanics.Compound,
                Equipment  = new List <ExerciseEquipment> {
                    new ExerciseEquipment {
                        Title = "Bench"
                    },
                    new ExerciseEquipment {
                        Title = "Ball"
                    }
                },
                CanBeDoneAtHome = false,
                MET             = 2.3M,
                CreationInfo    = new CreationInfo {
                    CreationTimeUTC     = DateTime.UtcNow,
                    LastModifiedTimeUTC = DateTime.UtcNow
                },
                CreateUserId = user.Id,
                CreateUser   = user.UserProfile
            };

            context.Exercises.AddOrUpdate(exercise);


            // Running
            steps = new ExerciseStep[] {
                new ExerciseStep {
                    Description = "Wear running shoes.",
                    Order       = 0
                },
                new ExerciseStep {
                    Description = "Go running!",
                    Order       = 1
                }
            };

            muscles = new List <ExerciseMuscles> {
                new ExerciseMuscles {
                    Title = "Legs"
                }
            };

            context.Muscles.AddOrUpdate(muscles[0]);

            exercise = new Exercise
            {
                Title       = "Running",
                Description = "Running is an excelent exercise!",
                Steps       = steps.ToList(),
                MainMuscles = muscles,
                Type        = (int)ExerciseTypes.Cardio,
                Complexity  = (int)ExerciseComplexity.BeginningLevel,
                Mechanics   = (int)ExerciseMechanics.Compound,
                //Equipment = new List<ExerciseEquipment>{},
                CanBeDoneAtHome = false,
                MET             = 8,
                CreationInfo    = new CreationInfo
                {
                    CreationTimeUTC     = DateTime.UtcNow,
                    LastModifiedTimeUTC = DateTime.UtcNow
                },
                CreateUserId = user.Id,
                CreateUser   = user.UserProfile
            };

            context.Exercises.AddOrUpdate(exercise);
            #endregion

            #region __Заполняем дневник упражнений__
            var workoutDiaryEntry = new WorkoutDiaryEntry
            {
                DateUTC    = DateTime.UtcNow,
                ExerciseId = exercise.ExerciseId,
                Exercise   = exercise,
                Sets       = new List <WorkoutSet>
                {
                    new WorkoutSet {
                        Order       = 0,
                        Reps        = 2,
                        Weight      = 33,
                        IsCompleted = false
                    },
                    new WorkoutSet {
                        Order       = 1,
                        Reps        = 4,
                        Weight      = 44,
                        IsCompleted = false
                    }
                },
                CreationInfo = new CreationInfo
                {
                    CreationTimeUTC     = DateTime.UtcNow,
                    LastModifiedTimeUTC = DateTime.UtcNow
                },
                CreateUserId = user.Id,
                CreateUser   = user.UserProfile
            };

            context.WorkoutDiaryEntries.AddOrUpdate(workoutDiaryEntry);
            #endregion

            context.SaveChanges();
#endif
        }