Changeset 194


Ignore:
Timestamp:
Oct 13, 2005 3:29:04 PM (14 years ago)
Author:
forrest
Message:

extra stuff

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Test/CoinSolve.cpp

    r193 r194  
    6161#include "CglClique.hpp"
    6262#include "CglFlowCover.hpp"
    63 #include "CglMixedIntegerRounding.hpp"
     63#include "CglMixedIntegerRounding2.hpp"
    6464#include "CglTwomir.hpp"
    6565
     
    117117    OsiClpSolverInterface solver1;
    118118    CbcModel model(solver1);
     119    CbcModel * babModel = NULL;
    119120    model.setNumberBeforeTrust(5);
    120121    OsiSolverInterface * solver = model.solver();
     
    132133    int slpValue=-1;
    133134    int printOptions=0;
     135    int printMode=0;
    134136    int presolveOptions=0;
    135137    int doCrash=0;
     
    152154    std::string exportFile ="default.mps";
    153155    std::string importBasisFile ="";
     156    std::string debugFile="";
     157    double * debugValues = NULL;
    154158    int basisHasValues=0;
    155159    std::string exportBasisFile ="default.bas";
     
    163167    parameters[whichParam(BASISIN,numberParameters,parameters)].setStringValue(importBasisFile);
    164168    parameters[whichParam(BASISOUT,numberParameters,parameters)].setStringValue(exportBasisFile);
     169    parameters[whichParam(DEBUG,numberParameters,parameters)].setStringValue(debugFile);
    165170    parameters[whichParam(DIRECTORY,numberParameters,parameters)].setStringValue(directory);
    166171    parameters[whichParam(DUALBOUND,numberParameters,parameters)].setDoubleValue(lpSolver->dualBound());
     
    240245    parameters[whichParam(CLIQUECUTS,numberParameters,parameters)].setCurrentOption("on");
    241246
    242     CglMixedIntegerRounding mixedGen;
     247    CglMixedIntegerRounding2 mixedGen;
    243248    // set default action (0=off,1=on,2=root)
    244249    int mixedAction=1;
     
    573578              allowImportErrors = action;
    574579              break;
     580            case INTPRINT:
     581              printMode=action;
     582              break;
    575583              //case ALGORITHM:
    576584              //algorithm  = action;
     
    954962              OsiSolverInterface * saveSolver=NULL;
    955963              CglPreProcess process;
     964              delete babModel;
     965              babModel = new CbcModel(model);
     966              OsiSolverInterface * solver3 = clpSolver->clone();
     967              babModel->assignSolver(solver3);
     968              clpSolver = dynamic_cast< OsiClpSolverInterface*> (babModel->solver());
     969              lpSolver = clpSolver->getModelPtr();
    956970              if (preProcess) {
    957                 saveSolver=model.solver()->clone();
     971                saveSolver=babModel->solver()->clone();
    958972                /* Do not try and produce equality cliques and
    959973                   do up to 10 passes */
     
    967981                }
    968982                //solver2->resolve();
     983                if (preProcess==2) {
     984                  OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (solver2);
     985                  ClpSimplex * lpSolver = clpSolver->getModelPtr();
     986                  lpSolver->writeMps("presolved.mps",0,1,lpSolver->optimizationDirection());
     987                  printf("Preprocessed model (minimization) on presolved.mps\n");
     988                }
    969989                // we have to keep solver2 so pass clone
    970990                solver2 = solver2->clone();
    971                 model.assignSolver(solver2);
    972                 model.initialSolve();
     991                babModel->assignSolver(solver2);
     992                babModel->initialSolve();
    973993              }
    974994              if (0) {
    975995                // for debug
    976996                std::string problemName ;
    977                 model.solver()->getStrParam(OsiProbName,problemName) ;
    978                 model.solver()->activateRowCutDebugger(problemName.c_str()) ;
     997                babModel->solver()->getStrParam(OsiProbName,problemName) ;
     998                babModel->solver()->activateRowCutDebugger(problemName.c_str()) ;
    979999                twomirGen.probname_=strdup(problemName.c_str());
    9801000                // checking seems odd
    981                 //redsplitGen.set_given_optsol(model.solver()->getRowCutDebuggerAlways()->optimalSolution(),
    982                 //                         model.getNumCols());
     1001                //redsplitGen.set_given_optsol(babModel->solver()->getRowCutDebuggerAlways()->optimalSolution(),
     1002                //                         babModel->getNumCols());
     1003              }
     1004              if (debugValues) {
     1005                // for debug
     1006                babModel->solver()->activateRowCutDebugger(debugValues) ;
    9831007              }
    9841008              // FPump done first as it only works if no solution
    985               CbcHeuristicFPump heuristic4(model);
     1009              CbcHeuristicFPump heuristic4(*babModel);
    9861010              if (useFpump) {
    9871011                heuristic4.setMaximumPasses(useFpump);
    988                 model.addHeuristic(&heuristic4);
     1012                babModel->addHeuristic(&heuristic4);
    9891013              }
    990               CbcRounding heuristic1(model);
     1014              CbcRounding heuristic1(*babModel);
    9911015              if (useRounding)
    992                 model.addHeuristic(&heuristic1) ;
    993               CbcHeuristicLocal heuristic2(model);
     1016                babModel->addHeuristic(&heuristic1) ;
     1017              CbcHeuristicLocal heuristic2(*babModel);
    9941018              heuristic2.setSearchType(1);
    9951019              if (useCombine)
    996                 model.addHeuristic(&heuristic2);
    997               CbcHeuristicGreedyCover heuristic3(model);
    998               CbcHeuristicGreedyEquality heuristic3a(model);
     1020                babModel->addHeuristic(&heuristic2);
     1021              CbcHeuristicGreedyCover heuristic3(*babModel);
     1022              CbcHeuristicGreedyEquality heuristic3a(*babModel);
    9991023              if (useGreedy) {
    1000                 model.addHeuristic(&heuristic3);
    1001                 model.addHeuristic(&heuristic3a);
     1024                babModel->addHeuristic(&heuristic3);
     1025                babModel->addHeuristic(&heuristic3a);
    10021026              }
    10031027              if (useLocalTree) {
    1004                 CbcTreeLocal localTree(&model,NULL,10,0,0,10000,2000);
    1005                 model.passInTreeHandler(localTree);
     1028                CbcTreeLocal localTree(babModel,NULL,10,0,0,10000,2000);
     1029                babModel->passInTreeHandler(localTree);
    10061030              }
    10071031              // add cut generators if wanted
    10081032              if (probingAction==1)
    1009                 model.addCutGenerator(&probingGen,-1,"Probing");
     1033                babModel->addCutGenerator(&probingGen,-1,"Probing");
    10101034              else if (probingAction==2)
    1011                 model.addCutGenerator(&probingGen,-99,"Probing");
     1035                babModel->addCutGenerator(&probingGen,-99,"Probing");
    10121036              if (gomoryAction==1)
    1013                 model.addCutGenerator(&gomoryGen,-1,"Gomory");
     1037                babModel->addCutGenerator(&gomoryGen,-1,"Gomory");
    10141038              else if (gomoryAction==2)
    1015                 model.addCutGenerator(&gomoryGen,-99,"Gomory");
     1039                babModel->addCutGenerator(&gomoryGen,-99,"Gomory");
    10161040              if (knapsackAction==1)
    1017                 model.addCutGenerator(&knapsackGen,-1,"Knapsack");
     1041                babModel->addCutGenerator(&knapsackGen,-1,"Knapsack");
    10181042              else if (knapsackAction==2)
    1019                 model.addCutGenerator(&knapsackGen,-99,"Knapsack");
     1043                babModel->addCutGenerator(&knapsackGen,-99,"Knapsack");
    10201044              if (redsplitAction==1)
    1021                 model.addCutGenerator(&redsplitGen,-1,"Reduce-and-split");
     1045                babModel->addCutGenerator(&redsplitGen,-1,"Reduce-and-split");
    10221046              else if (redsplitAction==2)
    1023                 model.addCutGenerator(&redsplitGen,-99,"Reduce-and-split");
     1047                babModel->addCutGenerator(&redsplitGen,-99,"Reduce-and-split");
    10241048              if (cliqueAction==1)
    1025                 model.addCutGenerator(&cliqueGen,-1,"Clique");
     1049                babModel->addCutGenerator(&cliqueGen,-1,"Clique");
    10261050              else if (cliqueAction==2)
    1027                 model.addCutGenerator(&cliqueGen,-99,"Clique");
     1051                babModel->addCutGenerator(&cliqueGen,-99,"Clique");
    10281052              if (mixedAction==1)
    1029                 model.addCutGenerator(&mixedGen,-1,"MixedintegerRounding");
     1053                babModel->addCutGenerator(&mixedGen,-1,"MixedIntegerRounding2");
    10301054              else if (mixedAction==2)
    1031                 model.addCutGenerator(&mixedGen,-99,"MixedintegerRounding");
     1055                babModel->addCutGenerator(&mixedGen,-99,"MixedIntegerRounding2");
    10321056              if (flowAction==1)
    1033                 model.addCutGenerator(&flowGen,-1,"FlowCover");
     1057                babModel->addCutGenerator(&flowGen,-1,"FlowCover");
    10341058              else if (flowAction==2)
    1035                 model.addCutGenerator(&flowGen,-99,"FlowCover");
     1059                babModel->addCutGenerator(&flowGen,-99,"FlowCover");
    10361060              if (twomirAction==1)
    1037                 model.addCutGenerator(&twomirGen,-1,"TwoMirCuts");
     1061                babModel->addCutGenerator(&twomirGen,-1,"TwoMirCuts");
    10381062              else if (twomirAction==2)
    1039                 model.addCutGenerator(&twomirGen,-99,"TwoMirCuts");
     1063                babModel->addCutGenerator(&twomirGen,-99,"TwoMirCuts");
    10401064              // Say we want timings
    1041               int numberGenerators = model.numberCutGenerators();
     1065              int numberGenerators = babModel->numberCutGenerators();
    10421066              int iGenerator;
    10431067              int cutDepth=
    10441068                parameters[whichParam(CUTDEPTH,numberParameters,parameters)].intValue();
    10451069              for (iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
    1046                 CbcCutGenerator * generator = model.cutGenerator(iGenerator);
     1070                CbcCutGenerator * generator = babModel->cutGenerator(iGenerator);
    10471071                generator->setTiming(true);
    10481072                if (cutDepth>=0)
     
    10501074              }
    10511075              // Could tune more
    1052               model.setMinimumDrop(min(1.0,
    1053                                         fabs(model.getMinimizationObjValue())*1.0e-3+1.0e-4));
     1076              babModel->setMinimumDrop(min(1.0,
     1077                                        fabs(babModel->getMinimizationObjValue())*1.0e-3+1.0e-4));
    10541078             
    1055               if (model.getNumCols()<500)
    1056                 model.setMaximumCutPassesAtRoot(-100); // always do 100 if possible
    1057               else if (model.getNumCols()<5000)
    1058                 model.setMaximumCutPassesAtRoot(100); // use minimum drop
     1079              if (babModel->getNumCols()<500)
     1080                babModel->setMaximumCutPassesAtRoot(-100); // always do 100 if possible
     1081              else if (babModel->getNumCols()<5000)
     1082                babModel->setMaximumCutPassesAtRoot(100); // use minimum drop
    10591083              else
    1060                 model.setMaximumCutPassesAtRoot(20);
    1061               model.setMaximumCutPasses(2);
     1084                babModel->setMaximumCutPassesAtRoot(20);
     1085              babModel->setMaximumCutPasses(2);
    10621086             
    10631087              // Do more strong branching if small
    1064               //if (model.getNumCols()<5000)
    1065               //model.setNumberStrong(20);
     1088              //if (babModel->getNumCols()<5000)
     1089              //babModel->setNumberStrong(20);
    10661090              // Switch off strong branching if wanted
    1067               //if (model.getNumCols()>10*model.getNumRows())
    1068               //model.setNumberStrong(0);
    1069               model.messageHandler()->setLogLevel(parameters[log].intValue());
    1070               if (model.getNumCols()>2000||model.getNumRows()>1500||
    1071                   model.messageHandler()->logLevel()>1)
    1072                 model.setPrintFrequency(100);
     1091              //if (babModel->getNumCols()>10*babModel->getNumRows())
     1092              //babModel->setNumberStrong(0);
     1093              babModel->messageHandler()->setLogLevel(parameters[log].intValue());
     1094              if (babModel->getNumCols()>2000||babModel->getNumRows()>1500||
     1095                  babModel->messageHandler()->logLevel()>1)
     1096                babModel->setPrintFrequency(100);
    10731097             
    1074               model.solver()->setIntParam(OsiMaxNumIterationHotStart,100);
    1075               OsiClpSolverInterface * osiclp = dynamic_cast< OsiClpSolverInterface*> (model.solver());
     1098              babModel->solver()->setIntParam(OsiMaxNumIterationHotStart,100);
     1099              OsiClpSolverInterface * osiclp = dynamic_cast< OsiClpSolverInterface*> (babModel->solver());
    10761100              // go faster stripes
    10771101              if (osiclp->getNumRows()<300&&osiclp->getNumCols()<500) {
     
    10841108              osiclp->setSpecialOptions(osiclp->specialOptions()|(128+64));
    10851109              if (gapRatio < 1.0e100) {
    1086                 double value = model.solver()->getObjValue() ;
     1110                double value = babModel->solver()->getObjValue() ;
    10871111                double value2 = gapRatio*(1.0e-5+fabs(value)) ;
    1088                 model.setAllowableGap(value2) ;
     1112                babModel->setAllowableGap(value2) ;
    10891113                std::cout << "Continuous " << value
    10901114                          << ", so allowable gap set to "
    10911115                          << value2 << std::endl ;
    10921116              }
    1093               currentBranchModel = &model;
    1094               model.branchAndBound();
     1117              currentBranchModel = babModel;
     1118              babModel->branchAndBound();
    10951119              currentBranchModel = NULL;
     1120              if (debugFile=="createAfterPre"&&babModel->bestSolution()) {
     1121                FILE * fp = fopen("debug.file","wb");
     1122                assert (fp);
     1123                int n = babModel->getNumCols();
     1124                fwrite(babModel->bestSolution(),sizeof(double),n,fp);
     1125                fclose(fp);
     1126              }
     1127              // Print more statistics
     1128              std::cout<<"Cuts at root node changed objective from "<<babModel->getContinuousObjective()
     1129                       <<" to "<<babModel->rootObjectiveAfterCuts()<<std::endl;
     1130             
     1131              for (iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
     1132                CbcCutGenerator * generator = babModel->cutGenerator(iGenerator);
     1133                std::cout<<generator->cutGeneratorName()<<" was tried "
     1134                         <<generator->numberTimesEntered()<<" times and created "
     1135                         <<generator->numberCutsInTotal()<<" cuts of which "
     1136                         <<generator->numberCutsActive()<<" were active after adding rounds of cuts";
     1137                if (generator->timing())
     1138                  std::cout<<" ( "<<generator->timeInCutGenerator()<<" seconds)"<<std::endl;
     1139                else
     1140                  std::cout<<std::endl;
     1141              }
    10961142              time2 = CoinCpuTime();
    10971143              totalTime += time2-time1;
    1098               if (model.getMinimizationObjValue()<1.0e50) {
     1144              if (babModel->getMinimizationObjValue()<1.0e50) {
    10991145                // post process
    11001146                if (preProcess) {
    1101                   process.postProcess(*model.solver());
     1147                  process.postProcess(*babModel->solver());
    11021148                  // Solution now back in saveSolver
    1103                   model.assignSolver(saveSolver);
    1104                   clpSolver = dynamic_cast< OsiClpSolverInterface*> (model.solver());
    1105                   lpSolver = clpSolver->getModelPtr();
     1149                  babModel->assignSolver(saveSolver);
    11061150                }
    11071151              }
    1108               std::cout<<"Result "<<model.getObjValue()<<
    1109                 " iterations "<<model.getIterationCount()<<
    1110                 " nodes "<<model.getNodeCount()<<
     1152              if (debugFile=="create"&&babModel->bestSolution()) {
     1153                FILE * fp = fopen("debug.file","wb");
     1154                assert (fp);
     1155                int n = babModel->getNumCols();
     1156                fwrite(babModel->bestSolution(),sizeof(double),n,fp);
     1157                fclose(fp);
     1158              }
     1159              clpSolver = dynamic_cast< OsiClpSolverInterface*> (babModel->solver());
     1160              lpSolver = clpSolver->getModelPtr();
     1161              std::cout<<"Result "<<babModel->getObjValue()<<
     1162                " iterations "<<babModel->getIterationCount()<<
     1163                " nodes "<<babModel->getNodeCount()<<
    11111164                " took "<<time2-time1<<" seconds - total "<<totalTime<<std::endl;
    11121165              time1 = time2;
     
    11171170          case IMPORT:
    11181171            {
     1172              delete babModel;
     1173              babModel=NULL;
    11191174              // get next field
    11201175              field = CoinReadGetString(argc,argv);
     
    14131468            }
    14141469            break;
     1470          case DEBUG:
     1471            if (goodModel) {
     1472              delete [] debugValues;
     1473              debugValues=NULL;
     1474              // get next field
     1475              field = CoinReadGetString(argc,argv);
     1476              if (field=="$") {
     1477                field = parameters[iParam].stringValue();
     1478              } else if (field=="EOL") {
     1479                parameters[iParam].printString();
     1480                break;
     1481              } else {
     1482                parameters[iParam].setStringValue(field);
     1483                debugFile=field;
     1484                if (debugFile=="create"||
     1485                    debugFile=="createAfterPre") {
     1486                  printf("Will create a debug file so this run should be a good one\n");
     1487                  break;
     1488                }
     1489              }
     1490              std::string fileName;
     1491              if (field[0]=='/'||field[0]=='\\') {
     1492                fileName = field;
     1493              } else if (field[0]=='~') {
     1494                char * environ = getenv("HOME");
     1495                if (environ) {
     1496                  std::string home(environ);
     1497                  field=field.erase(0,1);
     1498                  fileName = home+field;
     1499                } else {
     1500                  fileName=field;
     1501                }
     1502              } else {
     1503                fileName = directory+field;
     1504              }
     1505              FILE *fp=fopen(fileName.c_str(),"rb");
     1506              if (fp) {
     1507                // can open - lets go for it
     1508                int numColumns = lpSolver->getNumCols();
     1509                debugValues = new double[numColumns];
     1510                int n=fread(debugValues,sizeof(double),numColumns,fp);
     1511                printf("%d doubles read into debugValues\n",n);
     1512                fclose(fp);
     1513              } else {
     1514                std::cout<<"Unable to open file "<<fileName<<std::endl;
     1515              }
     1516            } else {
     1517              std::cout<<"** Current model not valid"<<std::endl;
     1518            }
     1519            break;
    14151520          case BASISOUT:
    14161521            if (goodModel) {
     
    18031908                char format[6];
    18041909                sprintf(format,"%%-%ds",CoinMax(lengthName,8));
    1805                 for (iRow=0;iRow<numberRows;iRow++) {
    1806                   int type=0;
    1807                   if (primalRowSolution[iRow]>rowUpper[iRow]+primalTolerance||
    1808                       primalRowSolution[iRow]<rowLower[iRow]-primalTolerance) {
    1809                     fprintf(fp,"** ");
    1810                     type=2;
    1811                   } else if (fabs(primalRowSolution[iRow])>1.0e-8) {
    1812                     type=1;
    1813                   } else if (numberRows<50) {
    1814                     type=3;
    1815                   }
    1816                   if (type) {
    1817                     fprintf(fp,"%7d ",iRow);
    1818                     if (lengthName)
    1819                       fprintf(fp,format,rowNames[iRow].c_str());
    1820                     fprintf(fp,"%15.8g        %15.8g\n",primalRowSolution[iRow],
    1821                             dualRowSolution[iRow]);
    1822                   }
    1823                 }
     1910                if (printMode>2) {
     1911                  for (iRow=0;iRow<numberRows;iRow++) {
     1912                    int type=printMode-3;
     1913                    if (primalRowSolution[iRow]>rowUpper[iRow]+primalTolerance||
     1914                        primalRowSolution[iRow]<rowLower[iRow]-primalTolerance) {
     1915                      fprintf(fp,"** ");
     1916                      type=2;
     1917                    } else if (fabs(primalRowSolution[iRow])>1.0e-8) {
     1918                      type=1;
     1919                    } else if (numberRows<50) {
     1920                      type=3;
     1921                    }
     1922                    if (type) {
     1923                      fprintf(fp,"%7d ",iRow);
     1924                      if (lengthName)
     1925                        fprintf(fp,format,rowNames[iRow].c_str());
     1926                      fprintf(fp,"%15.8g        %15.8g\n",primalRowSolution[iRow],
     1927                              dualRowSolution[iRow]);
     1928                    }
     1929                  }
     1930                }
    18241931                int iColumn;
    18251932                int numberColumns=lpSolver->numberColumns();
     
    18301937                double * columnLower = lpSolver->columnLower();
    18311938                double * columnUpper = lpSolver->columnUpper();
    1832                 for (iColumn=0;iColumn<numberColumns;iColumn++) {
    1833                   int type=0;
    1834                   if (primalColumnSolution[iColumn]>columnUpper[iColumn]+primalTolerance||
    1835                       primalColumnSolution[iColumn]<columnLower[iColumn]-primalTolerance) {
    1836                     fprintf(fp,"** ");
    1837                     type=2;
    1838                   } else if (fabs(primalColumnSolution[iColumn])>1.0e-8) {
    1839                     type=1;
    1840                   } else if (numberColumns<50) {
    1841                     type=3;
    1842                   }
    1843                   if (type) {
    1844                     fprintf(fp,"%7d ",iColumn);
    1845                     if (lengthName)
    1846                       fprintf(fp,format,columnNames[iColumn].c_str());
    1847                     fprintf(fp,"%15.8g        %15.8g\n",
    1848                             primalColumnSolution[iColumn],
    1849                             dualColumnSolution[iColumn]);
    1850                   }
    1851                 }
     1939                if (printMode!=2) {
     1940                  for (iColumn=0;iColumn<numberColumns;iColumn++) {
     1941                    int type=0;
     1942                    if (primalColumnSolution[iColumn]>columnUpper[iColumn]+primalTolerance||
     1943                        primalColumnSolution[iColumn]<columnLower[iColumn]-primalTolerance) {
     1944                      fprintf(fp,"** ");
     1945                      type=2;
     1946                    } else if (fabs(primalColumnSolution[iColumn])>1.0e-8) {
     1947                      type=1;
     1948                    } else if (numberColumns<50) {
     1949                      type=3;
     1950                    }
     1951                    // see if integer
     1952                    if (!lpSolver->isInteger(iColumn)&&printMode==1)
     1953                      type=0;
     1954                    if (type) {
     1955                      fprintf(fp,"%7d ",iColumn);
     1956                      if (lengthName)
     1957                        fprintf(fp,format,columnNames[iColumn].c_str());
     1958                      fprintf(fp,"%15.8g        %15.8g\n",
     1959                              primalColumnSolution[iColumn],
     1960                              dualColumnSolution[iColumn]);
     1961                    }
     1962                  }
     1963                } else {
     1964                  // special format suitable for OsiRowCutDebugger
     1965                  int n=0;
     1966                  bool comma=false;
     1967                  bool newLine=false;
     1968                  fprintf(fp,"\tint intIndicesV[]={\n");
     1969                  for (iColumn=0;iColumn<numberColumns;iColumn++) {
     1970                    if(primalColumnSolution[iColumn]>0.5&&model.solver()->isInteger(iColumn)) {
     1971                      if (comma)
     1972                        fprintf(fp,",");
     1973                      if (newLine)
     1974                        fprintf(fp,"\n");
     1975                      fprintf(fp,"%d ",iColumn);
     1976                      comma=true;
     1977                      newLine=false;
     1978                      n++;
     1979                      if (n==10) {
     1980                        n=0;
     1981                        newLine=true;
     1982                      }
     1983                    }
     1984                  }
     1985                  fprintf(fp,"};\n");
     1986                  n=0;
     1987                  comma=false;
     1988                  newLine=false;
     1989                  fprintf(fp,"\tdouble intSolnV[]={\n");
     1990                  for ( iColumn=0;iColumn<numberColumns;iColumn++) {
     1991                    if(primalColumnSolution[iColumn]>0.5&&model.solver()->isInteger(iColumn)) {
     1992                      if (comma)
     1993                        fprintf(fp,",");
     1994                      if (newLine)
     1995                        fprintf(fp,"\n");
     1996                      int value = (int) (primalColumnSolution[iColumn]+0.5);
     1997                      fprintf(fp,"%d. ",value);
     1998                      comma=true;
     1999                      newLine=false;
     2000                      n++;
     2001                      if (n==10) {
     2002                        n=0;
     2003                        newLine=true;
     2004                      }
     2005                    }
     2006                  }
     2007                  fprintf(fp,"};\n");
     2008                }
    18522009                if (fp!=stdout)
    18532010                  fclose(fp);
Note: See TracChangeset for help on using the changeset viewer.