//////////////////////////////////////////////////////////////////////////////// // Copyright © 2018 Jérémie Dumas // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include void ObjSens(double *x, double *x0, int n, int m, double *f, double *df, double *g, double *dg); // Math helpers void Print(double *x, int n); double Min(double d1, double d2); double Max(double d1, double d2); int Min(int d1, int d2); int Max(int d1, int d2); double Abs(double d1); int main(int argc, char *argv[]) { std::cout<<"///////////////////////////////////////////////////"< dist(Xmin, Xmax); for (int i = 0; i < n; ++i) { x[i] = dist(gen); x0[i] = xold[i] = x[i]; x[i] -= 1.0; } Print(x, n); for (int i = 0; i < n; ++i) { x[i] = dist(gen); } Print(x, n); // Initialize MMA MMASolver *mma = new MMASolver(n,m); mma->ConstraintModification(true); double ch = 1.0; int itr = 0; while (ch > 0.0002 && itr<1000) { itr++; ObjSens(x,x0,n,m,f,df,g,dg); // Set outer move limits for (int i=0;iUpdate(x,df,g,dg,xmin,xmax); // Compute infnorm on design change ch = 0.0; for (int i=0;i double safepow(T x, U n) { double y = std::pow(x, n); if (std::isinf(y)) { return 1e10; } else { return y; } } void ObjSens( double *x, double *x0, int n, int m, double *f, double *df, double *g, double *dg) { f[0] = 0.0; for (int i=0;id2 ? d1 : d2; } int Min(int d1, int d2) { return d1d2 ? d1 : d2; } double Abs(double d1) { return d1>0 ? d1 : -1.0*d1; }