public override ISolver CreateSolver(SolverSettings settings)
        {
            var attributeConstraints = AttributeConstraints.ToDictionary(
                constraint => constraint.Data,
                constraint => new Tuple <float, double>(constraint.TargetValue, constraint.Weight / 100.0));
            var pseudoConstraints = PseudoAttributeConstraints.ToDictionary(
                constraint => constraint.Data,
                constraint => new Tuple <float, double>(constraint.TargetValue, constraint.Weight / 100.0));

            return(new AdvancedSolver(Tree, new AdvancedSolverSettings(settings, CreateInitialAttributes(), attributeConstraints,
                                                                       pseudoConstraints, WeaponClass, Tags, OffHand)));
        }
        protected override Task <ISolver> CreateSolverAsync(SolverSettings settings)
        {
            var attributeConstraints = AttributeConstraints.ToDictionary(
                constraint => constraint.Data,
                constraint => new Tuple <float, double>(constraint.TargetValue, constraint.Weight / 100.0));
            var pseudoConstraints = PseudoAttributeConstraints.ToDictionary(
                constraint => constraint.Data,
                constraint => new Tuple <float, double>(constraint.TargetValue, constraint.Weight / 100.0));
            var solver = new AdvancedSolver(Tree, new AdvancedSolverSettings(settings, TotalPoints,
                                                                             CreateInitialAttributes(), attributeConstraints,
                                                                             pseudoConstraints, WeaponClass.Value, Tags.Value, OffHand.Value));

            return(Task.FromResult <ISolver>(solver));
        }