OptimizationSolver(OptimizationProblem optimizationProblem, OptimizationSubstitutions optimizationSubstitutions) { if (optimizationProblem == null) { throw new ArgumentNullException("optimizationProblem"); } if (optimizationSubstitutions == null) { throw new ArgumentNullException("optimizationSubstitutions"); } this.optimizationProblem = optimizationProblem; this.optimizationSubstitutions = optimizationSubstitutions; this.solver = new IpoptSolver(optimizationProblem.Problem.Substitute(optimizationSubstitutions.Substitutions), new Settings()); }
public static OptimizationSolver Create(OptimizationProblem optimizationProblem, OptimizationSubstitutions optimizationSubstitutions) { return(new OptimizationSolver(optimizationProblem, optimizationSubstitutions)); }
public bool NeedsRebuild(OptimizationProblem newOptimizationProblem, OptimizationSubstitutions newOptimizationSubstitutions) { return (optimizationProblem != newOptimizationProblem || optimizationSubstitutions != newOptimizationSubstitutions); }
static IEnumerable <Substitution> GetSubstitutions(OptimizationSegments optimizationSegments, OptimizationProblem optimizationProblem, double curveLength, IEnumerable <CurveSpecification> curveSpecifications) { yield return(new Substitution(optimizationProblem.CurveLength, Terms.Constant(curveLength))); IEnumerable <PointCurveSpecification> pointCurveSpecifications = curveSpecifications.OfType <PointCurveSpecification>(); IEnumerable <DirectionCurveSpecification> directionCurveSpecifications = curveSpecifications.OfType <DirectionCurveSpecification>(); IEnumerable <CurvatureCurveSpecification> curvatureCurveSpecifications = curveSpecifications.OfType <CurvatureCurveSpecification>(); foreach (int pointSpecificationTemplateIndex in Enumerable.Range(0, optimizationProblem.PointSpecificationTemplates.Count())) { SpecificationTemplate pointSpecificationTemplate = optimizationProblem.PointSpecificationTemplates.ElementAt(pointSpecificationTemplateIndex); if (pointSpecificationTemplateIndex < pointCurveSpecifications.Count()) { PointCurveSpecification pointCurveSpecification = pointCurveSpecifications.ElementAt(pointSpecificationTemplateIndex); ValueTerm position = Terms.Constant(pointCurveSpecification.Position); ValueTerm value = Terms.Constant(pointCurveSpecification.Point.X, pointCurveSpecification.Point.Y); foreach (Substitution substitution in pointSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments, pointCurveSpecification.Position, position, value)) { yield return(substitution); } } else { foreach (Substitution substitution in pointSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments)) { yield return(substitution); } } } foreach (int directionSpecificationTemplateIndex in Enumerable.Range(0, optimizationProblem.DirectionSpecificationTemplates.Count())) { SpecificationTemplate directionSpecificationTemplate = optimizationProblem.DirectionSpecificationTemplates.ElementAt(directionSpecificationTemplateIndex); if (directionSpecificationTemplateIndex < directionCurveSpecifications.Count()) { DirectionCurveSpecification directionCurveSpecification = directionCurveSpecifications.ElementAt(directionSpecificationTemplateIndex); ValueTerm position = Terms.Constant(directionCurveSpecification.Position); ValueTerm value = Terms.Constant(directionCurveSpecification.Direction); foreach (Substitution substitution in directionSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments, directionCurveSpecification.Position, position, value)) { yield return(substitution); } } else { foreach (Substitution substitution in directionSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments)) { yield return(substitution); } } } foreach (int curvatureSpecificationTemplateIndex in Enumerable.Range(0, optimizationProblem.CurvatureSpecificationTemplates.Count())) { SpecificationTemplate curvatureSpecificationTemplate = optimizationProblem.CurvatureSpecificationTemplates.ElementAt(curvatureSpecificationTemplateIndex); if (curvatureSpecificationTemplateIndex < curvatureCurveSpecifications.Count()) { CurvatureCurveSpecification curvatureCurveSpecification = curvatureCurveSpecifications.ElementAt(curvatureSpecificationTemplateIndex); ValueTerm position = Terms.Constant(curvatureCurveSpecification.Position); ValueTerm value = Terms.Constant(curvatureCurveSpecification.Curvature); foreach (Substitution substitution in curvatureSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments, curvatureCurveSpecification.Position, position, value)) { yield return(substitution); } } else { foreach (Substitution substitution in curvatureSpecificationTemplate.GetSubstitutions(optimizationSegments.Segments)) { yield return(substitution); } } } }
public static OptimizationSubstitutions Create(OptimizationSegments optimizationSegments, OptimizationProblem optimizationProblem, Specification specification) { return(new OptimizationSubstitutions ( optimizationSegments, optimizationProblem, specification.BasicSpecification.CurveLength, specification.BasicSpecification.CurveSpecifications )); }