public bool SolveSimple(AD.Term equation, AD.Variable[] args, double[,] limits, double[][] seeds) { rResults.Clear(); this.dim = args.Length; this.limits = limits; this.ranges = new double[dim]; for (int i = 0; i < dim; i++) { this.ranges[i] = (this.limits[i, 1] - this.limits[i, 0]); } equation = equation.AggregateConstants(); term = AD.TermUtils.Compile(equation, args); this.rpropStepWidth = new double[dim]; this.rpropStepConvergenceThreshold = new double[dim]; if (seeds != null) { for (int i = 0; i < seeds.Length; i++) { RpropResult r = RPropLoopSimple(seeds[i]); rResults.Add(r); if (r.finalUtil > 0.75) { return(true); } } } int runs = 2 * dim - (seeds == null?0:seeds.Length); for (int i = 0; i < runs; i++) { RpropResult r = RPropLoopSimple(null); rResults.Add(r); if (r.finalUtil > 0.75) { return(true); } } int adit = 0; while (!EvalResults() && adit++ < 20) { RpropResult r = RPropLoopSimple(null); rResults.Add(r); if (r.finalUtil > 0.75) { return(true); } } if (adit > 20) { Console.WriteLine("Failed to satisfy heuristic!"); } return(false); }
public double[] SolveTest(AD.Term equation, AD.Variable[] args, double[,] limits) { #if (GSOLVER_LOG) InitLog(); #endif rResults.Clear(); double[] res = null; this.dim = args.Length; this.limits = limits; this.ranges = new double[dim]; for (int i = 0; i < dim; i++) { this.ranges[i] = (this.limits[i, 1] - this.limits[i, 0]); } term = AD.TermUtils.Compile(equation, args); this.rpropStepWidth = new double[dim]; this.samplePoint = new double[dim]; this.Runs = 1; //this.Runs = 0; this.FEvals = 0; //int runs = 1000000; RpropResult rfirst = RPropLoop(null, false, true); if (rfirst.finalUtil > 0.75) { res = rfirst.finalValue; } else { while (true) { this.Runs++; //RpropResult r = RPropLoopSimple(null); RpropResult r = RPropLoop(null, false, false); //Console.WriteLine("Run: {0} Util: {1}",i,r.finalUtil); /*for(int k=0; k<dim; k++) { * Console.Write("{0}\t",r.finalValue[k]); * } * Console.WriteLine();*/ if (r.finalUtil > 0.75) { res = r.finalValue; break; } } } #if (GSOLVER_LOG) CloseLog(); #endif return(res); }
public double[] SolveTest(AD.Term equation, AD.Variable[] args, double[,] limits, int maxRuns, out bool found) { #if (GSOLVER_LOG) InitLog(); #endif found = false; rResults.Clear(); double[] res = null; this.dim = args.Length; this.limits = limits; this.ranges = new double[dim]; for (int i = 0; i < dim; i++) { this.ranges[i] = (this.limits[i, 1] - this.limits[i, 0]); } term = AD.TermUtils.Compile(equation, args); this.rpropStepWidth = new double[dim]; this.rpropStepConvergenceThreshold = new double[dim]; this.Runs = 0; this.FEvals = 0; while (this.Runs < maxRuns) { this.Runs++; //RpropResult r = RPropLoopSimple(null); RpropResult r = RPropLoop(null, false); //Console.WriteLine("Run: {0} Util: {1}",i,r.finalUtil); /*for(int k=0; k<dim; k++) { * Console.Write("{0}\t",r.finalValue[k]); * } * Console.WriteLine();*/ if (r.finalUtil > 0.75) { res = r.finalValue; found = true; break; } } #if (GSOLVER_LOG) CloseLog(); #endif return(res); }
public double[] Solve(AD.Term equation, AD.Variable[] args, double[,] limits, double[][] seeds, double sufficientUtility, out double util) { this.FEvals = 0; this.Runs = 0; util = 0; this.utilityThreshold = sufficientUtility; #if (GSOLVER_LOG) InitLog(); #endif rResults.Clear(); ulong begin = RosCS.RosSharp.Now(); this.dim = args.Length; this.limits = limits; this.ranges = new double[dim]; for (int i = 0; i < dim; i++) { this.ranges[i] = (this.limits[i, 1] - this.limits[i, 0]); } #if AGGREGATE_CONSTANTS equation = equation.AggregateConstants(); #endif term = AD.TermUtils.Compile(equation, args); AD.ConstraintUtility cu = (AD.ConstraintUtility)equation; bool utilIsConstant = (cu.Utility is AD.Constant); if (utilIsConstant) { this.utilityThreshold = 0.75; } bool constraintIsConstant = (cu.Constraint is AD.Constant); if (constraintIsConstant) { if (((AD.Constant)cu.Constraint).Value < 0.25) { util = ((AD.Constant)cu.Constraint).Value; double[] ret = new double[dim]; for (int i = 0; i < dim; i++) { ret[i] = this.ranges[i] / 2.0 + this.limits[i, 0]; } return(ret); } } //Optimize given seeds this.rpropStepWidth = new double[dim]; this.rpropStepConvergenceThreshold = new double[dim]; if (seeds != null) { this.Runs++; //Run with prefered cached seed RpropResult rpfirst = RPropLoop(seeds[0], true); if (rpfirst.finalUtil > this.utilityThreshold) { util = rpfirst.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rpfirst.finalValue); } rResults.Add(rpfirst); //run with seeds of all other agends for (int i = 1; i < seeds.Length; i++) { if (begin + this.maxSolveTime < RosCS.RosSharp.Now() || this.FEvals > this.MaxFEvals) { break; //do not check any further seeds } this.Runs++; RpropResult rp = RPropLoop(seeds[i], false); if (rp.finalUtil > this.utilityThreshold) { util = rp.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rp.finalValue); } rResults.Add(rp); } } //Here: Ignore all constraints search optimum if (begin + this.maxSolveTime > RosCS.RosSharp.Now() && this.FEvals < this.MaxFEvals) { //if time allows, do an unconstrained run if (!constraintIsConstant && !utilIsConstant && seedWithUtilOptimum) { AD.ICompiledTerm curProb = term; term = AD.TermUtils.Compile(((AD.ConstraintUtility)equation).Utility, args); this.Runs++; double[] utilitySeed = RPropLoop(null).finalValue; term = curProb; //Take result and search with constraints RpropResult ru = RPropLoop(utilitySeed, false); /*if (ru.finalUtil > this.utilityThreshold) { * util = ru.finalUtil; * return ru.finalValue; * }*/ rResults.Add(ru); } } do //Do runs until termination criteria, running out of time, or too many function evaluations { this.Runs++; RpropResult rp = RPropLoop(null, false); if (rp.finalUtil > this.utilityThreshold) { util = rp.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rp.finalValue); } rResults.Add(rp); } while(begin + this.maxSolveTime > RosCS.RosSharp.Now() && this.FEvals < this.MaxFEvals); //return best result int resIdx = 0; RpropResult res = rResults[0]; for (int i = 1; i < rResults.Count; i++) { if (Double.IsNaN(res.finalUtil) || rResults[i].finalUtil > res.finalUtil) { if (resIdx == 0 && seeds != null && !Double.IsNaN(res.finalUtil)) { if (rResults[i].finalUtil - res.finalUtil > utilitySignificanceThreshold && rResults[i].finalUtil > 0.75) { res = rResults[i]; resIdx = i; } } else { res = rResults[i]; resIdx = i; } } } //Console.WriteLine("ResultIndex: {0} Delta {1}",resIdx,res.finalUtil-rResults[0].finalUtil); #if (GSOLVER_LOG) CloseLog(); #endif // Console.Write("Found: "); // for(int i=0; i<dim; i++) { // Console.Write("{0}\t",res.finalValue[i]); // } // Console.WriteLine(); // //Console.WriteLine("Runs: {0} FEvals: {1}",this.Runs,this.FEvals); util = res.finalUtil; return(res.finalValue); }
public double[] Solve(AD.Term equation, AD.Variable[] args, double[,] limits, double[][] seeds, out double util) { //this.FEvals = 0; util = 0; #if (GSOLVER_LOG) InitLog(); #endif rResults.Clear(); this.dim = args.Length; this.limits = limits; this.ranges = new double[dim]; for (int i = 0; i < dim; i++) { this.ranges[i] = (this.limits[i, 1] - this.limits[i, 0]); } equation = equation.AggregateConstants(); term = AD.TermUtils.Compile(equation, args); AD.ConstraintUtility cu = (AD.ConstraintUtility)equation; bool utilIsConstant = (cu.Utility is AD.Constant); bool constraintIsConstant = (cu.Constraint is AD.Constant); if (constraintIsConstant) { if (((AD.Constant)cu.Constraint).Value < 0.25) { util = ((AD.Constant)cu.Constraint).Value; double[] ret = new double[dim]; for (int i = 0; i < dim; i++) { ret[i] = this.ranges[i] / 2.0 + this.limits[i, 0]; } return(ret); } } this.rpropStepWidth = new double[dim]; this.samplePoint = new double[dim]; if (seeds != null) { RpropResult rpfirst = RPropLoop(seeds[0], true, false); if (utilIsConstant && rpfirst.finalUtil > 0.75) { util = rpfirst.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rpfirst.finalValue); } rResults.Add(rpfirst); for (int i = 1; i < seeds.Length; i++) { RpropResult rp = RPropLoop(seeds[i], false, false); if (utilIsConstant && rp.finalUtil > 0.75) { util = rp.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rp.finalValue); } rResults.Add(rp); } } if (!constraintIsConstant && !utilIsConstant && seedWithUtilOptimum) { AD.ICompiledTerm curProb = term; term = AD.TermUtils.Compile(((AD.ConstraintUtility)equation).Utility, args); double[] utilitySeed = RPropLoop(null).finalValue; /*Console.WriteLine("Unconstraint Seed:"); * Console.Write("S: "); * foreach(double d in utilitySeed) Console.Write("{0} ",d); * Console.WriteLine(); */ term = curProb; rResults.Add(RPropLoop(utilitySeed, false, false)); } int runs = Math.Max(3, 1 * dim - (seeds == null?0:seeds.Length)); //runs = 10; RpropResult rpQS = RPropLoop(null, false, true); if (utilIsConstant && rpQS.finalUtil > 0.75) { util = rpQS.finalUtil; return(rpQS.finalValue); } rResults.Add(rpQS); for (int i = 1; i < runs; i++) { RpropResult rp = RPropLoop(null, false, false); if (utilIsConstant && rp.finalUtil > 0.75) { util = rp.finalUtil; //Console.WriteLine("FEvals: {0}",this.FEvals); return(rp.finalValue); } rResults.Add(rp); } int resIdx = 0; RpropResult res = rResults[0]; for (int i = 1; i < rResults.Count; i++) { if (Double.IsNaN(res.finalUtil) || rResults[i].finalUtil > res.finalUtil) { if (resIdx == 0 && seeds != null && !Double.IsNaN(res.finalUtil)) { if (rResults[i].finalUtil - res.finalUtil > utilitySignificanceThreshold && rResults[i].finalUtil > 0.75) { res = rResults[i]; resIdx = i; } } else { res = rResults[i]; resIdx = i; } } } //Console.WriteLine("ResultIndex: {0} Delta {1}",resIdx,res.finalUtil-rResults[0].finalUtil); #if (GSOLVER_LOG) CloseLog(); #endif // Console.Write("Found: "); // for(int i=0; i<dim; i++) { // Console.Write("{0}\t",res.finalValue[i]); // } // Console.WriteLine(); // //Console.WriteLine("FEvals: {0}",this.FEvals); util = res.finalUtil; return(res.finalValue); }
protected RpropResult RPropOptimizeFeasible(List <CNSAT.Var> constraints, AD.Term ut, AD.Variable[] args, double[] seed, bool precise) { //Compiled Term zusammenbauen AD.Term constr = AD.Term.True; foreach (CNSAT.Var v in constraints) { if (v.Assignment == Alica.Reasoner.CNSAT.Assignment.True) { constr &= v.Term; } else { constr &= ConstraintBuilder.Not(v.Term); } } AD.ConstraintUtility cu = new AD.ConstraintUtility(constr, ut); AD.ICompiledTerm term = AD.TermUtils.Compile(cu, args); Tuple <double[], double> tup; //fertig zusammengebaut runCount++; InitialStepSize(); double[] curGradient; RpropResult ret = new RpropResult(); // curGradient = InitialPoint(constraints, ret); if (seed != null) { curGradient = InitialPointFromSeed(constraints, ret, seed); } else { curGradient = InitialPoint(constraints, ret); } double curUtil = ret.initialUtil; double[] formerGradient = new double[dim]; double[] curValue = new double[dim]; //Tuple<double[],double> tup; Buffer.BlockCopy(ret.initialValue, 0, curValue, 0, sizeof(double) * dim); formerGradient = curGradient; int itcounter = 0; int badcounter = 0; #if (GSOLVER_LOG) Log(curUtil, curValue); #endif int maxIter = 60; int maxBad = 30; double minStep = 1E-11; if (precise) { maxIter = 120; //110 maxBad = 60; //60 minStep = 1E-15; //15 } int convergendDims = 0; while (itcounter++ < maxIter && badcounter < maxBad) { convergendDims = 0; for (int i = 0; i < dim; i++) { if (curGradient[i] * formerGradient[i] > 0) { rpropStepWidth[i] *= 1.3; } else if (curGradient[i] * formerGradient[i] < 0) { rpropStepWidth[i] *= 0.5; } rpropStepWidth[i] = Math.Max(minStep, rpropStepWidth[i]); //rpropStepWidth[i] = Math.Max(0.000001,rpropStepWidth[i]); if (curGradient[i] > 0) { curValue[i] += rpropStepWidth[i]; } else if (curGradient[i] < 0) { curValue[i] -= rpropStepWidth[i]; } if (curValue[i] > limits[i, 1]) { curValue[i] = limits[i, 1]; } else if (curValue[i] < limits[i, 0]) { curValue[i] = limits[i, 0]; } //Console.Write("{0}\t",curValue[i]); if (rpropStepWidth[i] < rpropStepConvergenceThreshold[i]) { ++convergendDims; } } //Abort if all dimensions are converged if (!precise && convergendDims >= dim) { return(ret); } this.fevalsCount++; formerGradient = curGradient; tup = term.Differentiate(curValue); bool allZero = true; for (int i = 0; i < dim; i++) { if (Double.IsNaN(tup.Item1[i])) { ret.aborted = false; //true; //HACK! #if (GSOLVER_LOG) LogStep(); #endif return(ret); } allZero &= (tup.Item1[i] == 0); } curUtil = tup.Item2; formerGradient = curGradient; curGradient = tup.Item1; #if (GSOLVER_LOG) Log(curUtil, curValue); #endif //Console.WriteLine("CurUtil: {0} Final {1}",curUtil,ret.finalUtil); if (curUtil > ret.finalUtil) { badcounter = 0; //Math.Max(0,badcounter-1); ret.finalUtil = curUtil; Buffer.BlockCopy(curValue, 0, ret.finalValue, 0, sizeof(double) * dim); //ret.finalValue = curValue; if (curUtil > 0.75) { return(ret); } } else { badcounter++; } if (allZero) { ret.aborted = false; #if (GSOLVER_LOG) LogStep(); #endif return(ret); } } #if (GSOLVER_LOG) LogStep(); #endif ret.aborted = false; return(ret); }