| 1 | #!/usr/bin/env python |
|---|
| 2 | # |
|---|
| 3 | # Author: Mike McKerns (mmckerns @caltech and @uqfoundation) |
|---|
| 4 | # Copyright (c) 2012-2016 California Institute of Technology. |
|---|
| 5 | # License: 3-clause BSD. The full license text is available at: |
|---|
| 6 | # - http://mmckerns.github.io/project/mystic/browser/mystic/LICENSE |
|---|
| 7 | |
|---|
| 8 | from restarts import sumt |
|---|
| 9 | from mystic.penalty import * |
|---|
| 10 | from mystic.constraints import * |
|---|
| 11 | from mystic.tools import random_seed |
|---|
| 12 | random_seed(123) |
|---|
| 13 | |
|---|
| 14 | def test_sumt1(solver, verbose=False): |
|---|
| 15 | def constraint1(x): |
|---|
| 16 | x1,x2 = x[0],x[1] |
|---|
| 17 | return x1**2 + x2**2 - 2. |
|---|
| 18 | |
|---|
| 19 | def constraint2(x): |
|---|
| 20 | x1,x2 = x[0],x[1] |
|---|
| 21 | return 0.25*x1**2 + 0.75*x2**2 - 1. |
|---|
| 22 | |
|---|
| 23 | @lagrange_inequality(constraint2) |
|---|
| 24 | @lagrange_equality(constraint1) |
|---|
| 25 | def penalty(x): |
|---|
| 26 | return 0.0 |
|---|
| 27 | |
|---|
| 28 | constraints_string = """ |
|---|
| 29 | x1**2 + x2**2 - 2. = 0. |
|---|
| 30 | 0.25*x1**2 + 0.75*x2**2 - 1. <= 0. |
|---|
| 31 | """ |
|---|
| 32 | if verbose: |
|---|
| 33 | print "constraints equations:%s" % (constraints_string.rstrip(),) |
|---|
| 34 | |
|---|
| 35 | def cost(x): |
|---|
| 36 | x1 = x[0] |
|---|
| 37 | x2 = x[1] |
|---|
| 38 | return x1**4 - 2.*x1**2*x2 + x1**2 + x1*x2**2 - 2.*x1 + 4. |
|---|
| 39 | |
|---|
| 40 | #XXX: Rand1Bin needs randomstate to work properly when no random_seed ? |
|---|
| 41 | #import random |
|---|
| 42 | #randomstate = random.getstate() #XXX: this should be an internal |
|---|
| 43 | solver.SetPenalty(penalty) |
|---|
| 44 | from mystic.termination import VTR |
|---|
| 45 | term = VTR() |
|---|
| 46 | _solver = sumt(cost, solver, term, disp=verbose)#, randomstate=randomstate) |
|---|
| 47 | soln = _solver.Solution() |
|---|
| 48 | satisfied = issolution(penalty, soln) |
|---|
| 49 | if verbose: |
|---|
| 50 | print "final answer:", soln |
|---|
| 51 | print "constraints satisfied:", satisfied |
|---|
| 52 | print "expected: [1., 1.]", "\n" |
|---|
| 53 | else: assert satisfied |
|---|
| 54 | |
|---|
| 55 | |
|---|
| 56 | def test_sumt2(solver, verbose=False): |
|---|
| 57 | def constraint1(x): |
|---|
| 58 | x1,x2,x3 = x[0],x[1],x[2] |
|---|
| 59 | return 5. - x2 |
|---|
| 60 | |
|---|
| 61 | def constraint2(x): |
|---|
| 62 | x1,x2,x3 = x[0],x[1],x[2] |
|---|
| 63 | return 4.*x1 - 5*x3 + 1. |
|---|
| 64 | |
|---|
| 65 | def constraint3(x): |
|---|
| 66 | x1,x2,x3 = x[0],x[1],x[2] |
|---|
| 67 | return (x1 - 10.)**2 + (x2 + 1)**2 - 50. |
|---|
| 68 | |
|---|
| 69 | @lagrange_inequality(constraint3) |
|---|
| 70 | @lagrange_inequality(constraint2) |
|---|
| 71 | @lagrange_inequality(constraint1) |
|---|
| 72 | def penalty(x): |
|---|
| 73 | return 0.0 |
|---|
| 74 | |
|---|
| 75 | constraints_string = """ |
|---|
| 76 | x2 > 5. |
|---|
| 77 | 4.*x1-5.*x3 < -1. |
|---|
| 78 | (x1-10.)**2 + (x2+1.)**2 < 50. |
|---|
| 79 | """ |
|---|
| 80 | if verbose: |
|---|
| 81 | print "constraints equations:%s" % (constraints_string.rstrip(),) |
|---|
| 82 | |
|---|
| 83 | def cost(x): |
|---|
| 84 | return (x[0] - 1.)**2 + (x[1]-2.)**2 + (x[2]-3.)**4 |
|---|
| 85 | |
|---|
| 86 | #XXX: Rand1Bin needs randomstate to work properly when no random_seed ? |
|---|
| 87 | #import random |
|---|
| 88 | #randomstate = random.getstate() #XXX: this should be an internal |
|---|
| 89 | solver.SetPenalty(penalty) |
|---|
| 90 | from mystic.termination import VTR |
|---|
| 91 | term = VTR() |
|---|
| 92 | _solver = sumt(cost, solver, term, disp=verbose)#, randomstate=randomstate) |
|---|
| 93 | soln = _solver.Solution() |
|---|
| 94 | satisfied = issolution(penalty, soln) |
|---|
| 95 | if verbose: |
|---|
| 96 | print "final answer:", soln |
|---|
| 97 | print "constraints satisfied:", satisfied |
|---|
| 98 | print "expected: [ 6.25827968 4.999961 5.20662288]", "\n" |
|---|
| 99 | else: assert satisfied |
|---|
| 100 | |
|---|
| 101 | |
|---|
| 102 | if __name__ == '__main__': |
|---|
| 103 | from mystic.solvers import DifferentialEvolutionSolver |
|---|
| 104 | from mystic.solvers import DifferentialEvolutionSolver2 |
|---|
| 105 | from mystic.solvers import PowellDirectionalSolver |
|---|
| 106 | from mystic.solvers import NelderMeadSimplexSolver |
|---|
| 107 | verbose = True |
|---|
| 108 | |
|---|
| 109 | x0 = [3., 2.]; ndim = 2; npop = 25 |
|---|
| 110 | #solver = DifferentialEvolutionSolver(ndim, npop) |
|---|
| 111 | #solver = DifferentialEvolutionSolver2(ndim, npop) |
|---|
| 112 | #solver = PowellDirectionalSolver(ndim) |
|---|
| 113 | solver = NelderMeadSimplexSolver(ndim) |
|---|
| 114 | solver.SetInitialPoints(x0) |
|---|
| 115 | test_sumt1(solver, verbose=verbose) |
|---|
| 116 | |
|---|
| 117 | x0 = [0., 0., 0.]; ndim = 3; npop = 40 |
|---|
| 118 | #solver = DifferentialEvolutionSolver(ndim, npop) |
|---|
| 119 | #solver = DifferentialEvolutionSolver2(ndim, npop) |
|---|
| 120 | #solver = PowellDirectionalSolver(ndim) |
|---|
| 121 | solver = NelderMeadSimplexSolver(ndim) |
|---|
| 122 | solver.SetInitialPoints(x0) |
|---|
| 123 | test_sumt2(solver, verbose=verbose) |
|---|
| 124 | |
|---|
| 125 | |
|---|
| 126 | #EOF |
|---|