Changeset 1946 for trunk/Clp/src


Ignore:
Timestamp:
Apr 18, 2013 9:39:00 AM (6 years ago)
Author:
forrest
Message:

allow AMPL in Clp

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:externals
      •  

        old new  
        11BuildTools        https://projects.coin-or.org/svn/BuildTools/stable/0.7
         2ThirdParty/ASL    https://projects.coin-or.org/svn/BuildTools/ThirdParty/ASL/stable/1.2
        23ThirdParty/Blas   https://projects.coin-or.org/svn/BuildTools/ThirdParty/Blas/stable/1.3
        34ThirdParty/Lapack https://projects.coin-or.org/svn/BuildTools/ThirdParty/Lapack/stable/1.4
         
        910CoinUtils         https://projects.coin-or.org/svn/CoinUtils/trunk/CoinUtils
        1011Osi               https://projects.coin-or.org/svn/Osi/trunk/Osi
        11 
  • trunk/Clp/src/ClpMain.cpp

    r1929 r1946  
    4040#include "ClpFactorization.hpp"
    4141#include "CoinTime.hpp"
     42#include "CoinWarmStartBasis.hpp"
    4243#include "ClpSimplex.hpp"
    4344#include "ClpSimplexOther.hpp"
    4445#include "ClpSolve.hpp"
     46#include "ClpMessage.hpp"
    4547#include "ClpPackedMatrix.hpp"
    4648#include "ClpPlusMinusOneMatrix.hpp"
     
    5961#include "AbcDualRowSteepest.hpp"
    6062#include "AbcDualRowDantzig.hpp"
     63#endif
     64#ifdef COIN_HAS_ASL
     65#include "Clp_ampl.h"
    6166#endif
    6267#ifdef DMALLOC
     
    263268          int numberGoodCommands = 0;
    264269          bool * goodModels = new bool[1];
     270          goodModels[0] = false;
     271#ifdef COIN_HAS_ASL
     272          ampl_info info;
     273          int usingAmpl=0;
     274          CoinMessageHandler * generalMessageHandler = models->messageHandler();
     275          generalMessageHandler->setPrefix(false);
     276          CoinMessages generalMessages = models->messages();
     277          char generalPrint[10000];
     278          {
     279            bool noPrinting_=false;
     280            memset(&info, 0, sizeof(info));
     281            if (argc > 2 && !strcmp(argv[2], "-AMPL")) {
     282              usingAmpl = 1;
     283              // see if log in list
     284              noPrinting_ = true;
     285              for (int i = 1; i < argc; i++) {
     286                    if (!strncmp(argv[i], "log", 3)) {
     287                        const char * equals = strchr(argv[i], '=');
     288                        if (equals && atoi(equals + 1) > 0) {
     289                            noPrinting_ = false;
     290                            info.logLevel = atoi(equals + 1);
     291                            int log = whichParam(CLP_PARAM_INT_LOGLEVEL, numberParameters, parameters);
     292                            parameters[log].setIntValue(info.logLevel);
     293                            // mark so won't be overWritten
     294                            info.numberRows = -1234567;
     295                            break;
     296                        }
     297                    }
     298                }
     299
     300                union {
     301                    void * voidModel;
     302                    CoinModel * model;
     303                } coinModelStart;
     304                coinModelStart.model = NULL;
     305                int returnCode = readAmpl(&info, argc, const_cast<char **>(argv), & coinModelStart.voidModel);
     306                if (returnCode)
     307                    return returnCode;
     308                if (info.numberBinary+info.numberIntegers+info.numberSos
     309                    &&!info.starts) {
     310                  printf("Unable to handle integer problems\n");
     311                  return 1;
     312                }
     313                CbcOrClpRead_mode = 2; // so will start with parameters
     314                // see if log in list (including environment)
     315                for (int i = 1; i < info.numberArguments; i++) {
     316                    if (!strcmp(info.arguments[i], "log")) {
     317                        if (i < info.numberArguments - 1 && atoi(info.arguments[i+1]) > 0)
     318                            noPrinting_ = false;
     319                        break;
     320                    }
     321                }
     322                if (noPrinting_) {
     323                    models->messageHandler()->setLogLevel(0);
     324                    setCbcOrClpPrinting(false);
     325                }
     326                if (!noPrinting_)
     327                    printf("%d rows, %d columns and %d elements\n",
     328                           info.numberRows, info.numberColumns, info.numberElements);
     329                if (!coinModelStart.model) {
     330                  // linear
     331                    models->loadProblem(info.numberColumns, info.numberRows, info.starts,
     332                                        info.rows, info.elements,
     333                                        info.columnLower, info.columnUpper, info.objective,
     334                                        info.rowLower, info.rowUpper);
     335                } else {
     336                  // QP
     337                  models->loadProblem(*(coinModelStart.model));
     338                }
     339                // If we had a solution use it
     340                if (info.primalSolution) {
     341                    models->setColSolution(info.primalSolution);
     342                }
     343                // status
     344                if (info.rowStatus) {
     345                    unsigned char * statusArray = models->statusArray();
     346                    int i;
     347                    for (i = 0; i < info.numberColumns; i++)
     348                        statusArray[i] = static_cast<unsigned char>(info.columnStatus[i]);
     349                    statusArray += info.numberColumns;
     350                    for (i = 0; i < info.numberRows; i++)
     351                        statusArray[i] = static_cast<unsigned char>(info.rowStatus[i]);
     352                }
     353                freeArrays1(&info);
     354                // modify objective if necessary
     355                models->setOptimizationDirection(info.direction);
     356                models->setObjectiveOffset(info.offset);
     357                if (info.offset) {
     358                    sprintf(generalPrint, "Ampl objective offset is %g",
     359                            info.offset);
     360                    generalMessageHandler->message(CLP_GENERAL, generalMessages)
     361                    << generalPrint
     362                    << CoinMessageEol;
     363                }
     364                goodModels[0] = true;
     365                // change argc etc
     366                argc = info.numberArguments;
     367                argv = const_cast<const char **>(info.arguments);
     368            }
     369        }
     370#endif
    265371
    266372          // Hidden stuff for barrier
     
    273379
    274380          int iModel = 0;
    275           goodModels[0] = false;
    276381          //models[0].scaling(1);
    277382          //models[0].setDualBound(1.0e6);
     
    374479                              verbose &= ~8;
    375480                         }
     481#ifdef COIN_HAS_ASL
     482                         if (verbose < 4 && usingAmpl)
     483                           verbose += 4;
     484#endif
    376485                         if (verbose)
    377486                              maxAcross = 1;
     
    683792                    } else {
    684793                         // action
    685                          if (type == CLP_PARAM_ACTION_EXIT)
    686                               break; // stop all
     794                         if (type == CLP_PARAM_ACTION_EXIT) {
     795#ifdef COIN_HAS_ASL
     796                           if (usingAmpl) {
     797                             writeAmpl(&info);
     798                             freeArrays2(&info);
     799                             freeArgs(&info);
     800                           }
     801#endif
     802                           break; // stop all
     803                         }
    687804                         switch (type) {
    688805                         case CLP_PARAM_ACTION_DUALSIMPLEX:
     
    9151032                                   try {
    9161033                                        status = model2->initialSolve(solveOptions);
     1034#ifdef COIN_HAS_ASL
     1035                            if (usingAmpl) {
     1036                                double value = model2->getObjValue() * model2->getObjSense();
     1037                                char buf[300];
     1038                                int pos = 0;
     1039                                int iStat = model2->status();
     1040                                if (iStat == 0) {
     1041                                    pos += sprintf(buf + pos, "optimal," );
     1042                                } else if (iStat == 1) {
     1043                                    // infeasible
     1044                                    pos += sprintf(buf + pos, "infeasible,");
     1045                                } else if (iStat == 2) {
     1046                                    // unbounded
     1047                                    pos += sprintf(buf + pos, "unbounded,");
     1048                                } else if (iStat == 3) {
     1049                                    pos += sprintf(buf + pos, "stopped on iterations or time,");
     1050                                } else if (iStat == 4) {
     1051                                    iStat = 7;
     1052                                    pos += sprintf(buf + pos, "stopped on difficulties,");
     1053                                } else if (iStat == 5) {
     1054                                    iStat = 3;
     1055                                    pos += sprintf(buf + pos, "stopped on ctrl-c,");
     1056                                } else if (iStat == 6) {
     1057                                    // bab infeasible
     1058                                    pos += sprintf(buf + pos, "integer infeasible,");
     1059                                    iStat = 1;
     1060                                } else {
     1061                                    pos += sprintf(buf + pos, "status unknown,");
     1062                                    iStat = 6;
     1063                                }
     1064                                info.problemStatus = iStat;
     1065                                info.objValue = value;
     1066                                pos += sprintf(buf + pos, " objective %.*g", ampl_obj_prec(),
     1067                                               value);
     1068                                sprintf(buf + pos, "\n%d iterations",
     1069                                        model2->getIterationCount());
     1070                                free(info.primalSolution);
     1071                                int numberColumns = model2->numberColumns();
     1072                                info.primalSolution = reinterpret_cast<double *> (malloc(numberColumns * sizeof(double)));
     1073                                CoinCopyN(model2->primalColumnSolution(), numberColumns, info.primalSolution);
     1074                                int numberRows = model2->numberRows();
     1075                                free(info.dualSolution);
     1076                                info.dualSolution = reinterpret_cast<double *> (malloc(numberRows * sizeof(double)));
     1077                                CoinCopyN(model2->dualRowSolution(), numberRows, info.dualSolution);
     1078                                CoinWarmStartBasis * basis = model2->getBasis();
     1079                                free(info.rowStatus);
     1080                                info.rowStatus = reinterpret_cast<int *> (malloc(numberRows * sizeof(int)));
     1081                                free(info.columnStatus);
     1082                                info.columnStatus = reinterpret_cast<int *> (malloc(numberColumns * sizeof(int)));
     1083                                // Put basis in
     1084                                int i;
     1085                                // free,basic,ub,lb are 0,1,2,3
     1086                                for (i = 0; i < numberRows; i++) {
     1087                                    CoinWarmStartBasis::Status status = basis->getArtifStatus(i);
     1088                                    info.rowStatus[i] = status;
     1089                                }
     1090                                for (i = 0; i < numberColumns; i++) {
     1091                                    CoinWarmStartBasis::Status status = basis->getStructStatus(i);
     1092                                    info.columnStatus[i] = status;
     1093                                }
     1094                                // put buffer into info
     1095                                strcpy(info.buffer, buf);
     1096                                delete basis;
     1097                            }
     1098#endif
    9171099#ifndef NDEBUG
    9181100                                        // if infeasible check ray
  • trunk/Clp/src/Makefile.am

    r1910 r1946  
    154154        ClpMain.cpp \
    155155        CbcOrClpParam.cpp CbcOrClpParam.hpp \
     156        Clp_ampl.cpp Clp_ampl.h \
    156157        MyEventHandler.cpp MyEventHandler.hpp \
    157158        MyMessageHandler.cpp MyMessageHandler.hpp \
     
    159160
    160161# List all additionally required libraries
    161 clp_LDADD = libClp.la $(CLPLIB_LIBS)
     162clp_LDADD = libClp.la $(CLPLIB_LIBS) $(ASL_LIBS)
    162163
    163164# List all dependency libraries (similar to LDADD, but without -l, -L flags)
  • trunk/Clp/src/Makefile.in

    r1910 r1946  
    256256PROGRAMS = $(bin_PROGRAMS)
    257257am_clp_OBJECTS = ClpMain.$(OBJEXT) CbcOrClpParam.$(OBJEXT) \
    258         MyEventHandler.$(OBJEXT) MyMessageHandler.$(OBJEXT) \
    259         unitTest.$(OBJEXT)
     258        Clp_ampl.$(OBJEXT) MyEventHandler.$(OBJEXT) \
     259        MyMessageHandler.$(OBJEXT) unitTest.$(OBJEXT)
    260260clp_OBJECTS = $(am_clp_OBJECTS)
    261261am__DEPENDENCIES_1 =
     
    324324AMTAR = @AMTAR@
    325325AR = @AR@
     326ASL_CFLAGS = @ASL_CFLAGS@
     327ASL_CFLAGS_INSTALLED = @ASL_CFLAGS_INSTALLED@
     328ASL_DATA = @ASL_DATA@
     329ASL_DATA_INSTALLED = @ASL_DATA_INSTALLED@
     330ASL_DEPENDENCIES = @ASL_DEPENDENCIES@
     331ASL_LIBS = @ASL_LIBS@
     332ASL_LIBS_INSTALLED = @ASL_LIBS_INSTALLED@
    326333AUTOCONF = @AUTOCONF@
    327334AUTOHEADER = @AUTOHEADER@
     
    366373COIN_HAS_AMD_FALSE = @COIN_HAS_AMD_FALSE@
    367374COIN_HAS_AMD_TRUE = @COIN_HAS_AMD_TRUE@
     375COIN_HAS_ASL_FALSE = @COIN_HAS_ASL_FALSE@
     376COIN_HAS_ASL_TRUE = @COIN_HAS_ASL_TRUE@
    368377COIN_HAS_BLAS_FALSE = @COIN_HAS_BLAS_FALSE@
    369378COIN_HAS_BLAS_TRUE = @COIN_HAS_BLAS_TRUE@
     
    619628        ClpMain.cpp \
    620629        CbcOrClpParam.cpp CbcOrClpParam.hpp \
     630        Clp_ampl.cpp Clp_ampl.h \
    621631        MyEventHandler.cpp MyEventHandler.hpp \
    622632        MyMessageHandler.cpp MyMessageHandler.hpp \
     
    625635
    626636# List all additionally required libraries
    627 clp_LDADD = libClp.la $(CLPLIB_LIBS)
     637clp_LDADD = libClp.la $(CLPLIB_LIBS) $(ASL_LIBS)
    628638
    629639# List all dependency libraries (similar to LDADD, but without -l, -L flags)
     
    861871@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClpSolve.Plo@am__quote@
    862872@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Clp_C_Interface.Plo@am__quote@
     873@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Clp_ampl.Po@am__quote@
    863874@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CoinAbcBaseFactorization1.Plo@am__quote@
    864875@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CoinAbcBaseFactorization2.Plo@am__quote@
  • trunk/Clp/src/OsiClp/Makefile.in

    r1910 r1946  
    106106AMTAR = @AMTAR@
    107107AR = @AR@
     108ASL_CFLAGS = @ASL_CFLAGS@
     109ASL_CFLAGS_INSTALLED = @ASL_CFLAGS_INSTALLED@
     110ASL_DATA = @ASL_DATA@
     111ASL_DATA_INSTALLED = @ASL_DATA_INSTALLED@
     112ASL_DEPENDENCIES = @ASL_DEPENDENCIES@
     113ASL_LIBS = @ASL_LIBS@
     114ASL_LIBS_INSTALLED = @ASL_LIBS_INSTALLED@
    108115AUTOCONF = @AUTOCONF@
    109116AUTOHEADER = @AUTOHEADER@
     
    148155COIN_HAS_AMD_FALSE = @COIN_HAS_AMD_FALSE@
    149156COIN_HAS_AMD_TRUE = @COIN_HAS_AMD_TRUE@
     157COIN_HAS_ASL_FALSE = @COIN_HAS_ASL_FALSE@
     158COIN_HAS_ASL_TRUE = @COIN_HAS_ASL_TRUE@
    150159COIN_HAS_BLAS_FALSE = @COIN_HAS_BLAS_FALSE@
    151160COIN_HAS_BLAS_TRUE = @COIN_HAS_BLAS_TRUE@
  • trunk/Clp/src/config.h.in

    r1910 r1946  
    2727/* Define to 1 if the AMD package is available */
    2828#undef COIN_HAS_AMD
     29
     30/* Define to 1 if the ASL package is available */
     31#undef COIN_HAS_ASL
    2932
    3033/* If defined, the BLAS Library is available. */
Note: See TracChangeset for help on using the changeset viewer.