예제 #1
0
void Transformer::assignHandler_(CGraphPtr cg, ConstraintPtr c)
{
  switch (cg->getOut()->getOp()) {
  case OpMult:
  case OpSqr:
    qHandler_->addConstraint(c);
    break;
  default:
    {
    VariablePtr iv;
    VariablePtr ov = VariablePtr();
    LinearFunctionPtr lf = c->getFunction()->getLinearFunction();
    if (lf) {
      assert(lf->getNumTerms()==1);
      ov = lf->termsBegin()->first;
    }
    iv = *(c->getFunction()->getNonlinearFunction()->varsBegin());
    uHandler_->addConstraint(c, iv, ov, 'E');
    }
  }
}
예제 #2
0
Bool logobj(LinearFunctionPtr lf, CGraphPtr nlf)
{
  UInt numvars = lf->getNumTerms();
  // VariableSet vars;
  // lf->getVars(&vars);
  VariableGroup::const_iterator it;
  VariableGroup::const_iterator begin = lf->termsBegin();
  VariableGroup::const_iterator end   = lf->termsEnd();
  // Variable nodes.
  std::map<UInt,CNode*> varnodes;
  std::map<CNode*, CNode*> lognodes;
  std::map<UInt, CNode*> logidnodes;
  std::map<CNode*, CNode*> numnodes;
  std::map<UInt, CNode*> numidnodes;
  std::map<CNode*, CNode*> mulnodes;
  std::map<UInt, CNode*> mulidnodes;
  std::set<CNode*> multnodes;
  std::map<UInt, CNode*> multidnodes;
  CNode** multnodesvec = new CNode*[numvars];
  // Iterate through variables.
  CNode* tempnode;
  CNode* lognode;
  CNode* numnode;
  CNode* mulnode;
  CNode* onenode;
  CNode* sumnode;
  // Create numnode for one.
  UInt index = 0;
  for(it=begin; it!=end; ++it) {
    VariablePtr var = it->first;
    Double varlb = var->getLb();
    if (varlb >= 0) {
      UInt varid = var->getId();
      Double coeff = it->second;
      // Create variable node and add it to a set.
      tempnode = nlf->newNode(var);
      varnodes.insert(std::pair<UInt,CNode*>(varid,tempnode));
      onenode = nlf->newNode(1.0);
      // Create sumnode.      
      sumnode = nlf->newNode(OpPlus, onenode, tempnode);
      // Create log nodes.
      lognode = nlf->newNode(OpLog, &sumnode, 1);
      lognodes.insert(std::pair<CNode* , CNode*>(tempnode, lognode));
      logidnodes.insert(std::pair<UInt, CNode*>(varid, lognode));
      // Create num nodes.
      numnode = nlf->newNode(coeff);
      numnodes.insert(std::pair<CNode*, CNode*>(tempnode, numnode));
      numidnodes.insert(std::pair<UInt, CNode*>(varid, numnode));
      // Create mul nodes.
      mulnode = nlf->newNode(OpMult, numnode, lognode);
      multnodes.insert(mulnode);
      multidnodes.insert(std::pair<UInt, CNode*>(varid,mulnode));
      multnodesvec[index] = mulnode;
      index++;
    }
  }
  
  // This is the root node.
  CNode* sumlistnode = nlf->newNode(OpSumList, multnodesvec, index);  
  nlf->setOut(sumlistnode);
  nlf->finalize();
  
  return true;
}
예제 #3
0
int
main(int argc, char** argv)
{
  if (argc < 2) {
    usage();
    return -1;
  }

  // build the name of the output file
  string fileName = argv[1];
  fileName.erase(fileName.size()-1);
  fileName.erase(fileName.size()-1);
  fileName.erase(fileName.size()-1);
  fileName += ".txt";

  char *outFileName = (char*)fileName.c_str();
  FILE *pFile;
  FILE *qFile;
  qFile = fopen("nameList.txt", "a");
  fprintf(qFile, "%s\n", outFileName);
  fclose(qFile);
  pFile = fopen(outFileName, "w");
  Minotaur::EnvPtr env = (Minotaur::EnvPtr) new Minotaur::Environment();
  MINOTAUR_AMPL::AMPLInterfacePtr iface = new MINOTAUR_AMPL::AMPLInterface(env);
  ProblemPtr inst, newInst;
  inst = iface->readInstance(argv[1]);
  int numVars = inst->getNumVars();
  int numCons = inst->getNumCons();
  
  fprintf(pFile,"%d\n", numVars);

  // find the number of linear constraints
  int numLinCons = 0;
  for(ConstraintConstIterator cIter=inst->consBegin(); cIter!=inst->consEnd(); ++cIter) {
    FunctionType ct = (*cIter)->getFunctionType();
    if(ct == Linear) {
      numLinCons++;
    }
  }

  // find the number of quadratic constraints
  int numQuadCons = 0;
  for(ConstraintConstIterator cIter=inst->consBegin(); cIter!=inst->consEnd(); ++cIter) {
    FunctionType ct = (*cIter)->getFunctionType();
    if(ct == Quadratic) {
      numQuadCons++;
    }
  }

  fprintf(pFile, "%d\n", numQuadCons);
  fprintf(pFile, "%d\n", numLinCons);

  ObjectivePtr obj = inst->getObjective(0);
  FunctionPtr objF = obj->getFunction();
  LinearFunctionPtr objLF = objF->getLinearFunction();
  QuadraticFunctionPtr objQF = objF->getQuadraticFunction();

  double **objQ = new double* [numVars];
  for(int i = 0; i < numVars; i++) 
    objQ[i] = new double[numVars];
  for(int i = 0; i < numVars; i++){
    for(int j = 0; j < numVars; j++) {
      objQ[i][j] = 0;
    }
  }

  double *objA = new double [numVars];
  for(int i = 0; i < numVars; i++)
    objA[i] = 0;

  //find objQ
  if(objQF) {
    for(VariableConstIterator varit1 = inst->varsBegin(); varit1 != inst->varsEnd(); ++varit1) {
      for(VariableConstIterator varit2 = inst->varsBegin(); varit2 != inst->varsEnd(); ++varit2) {
	for(VariablePairGroupConstIterator it = objQF->begin(); it != objQF->end(); ++it) {
	  if(((it->first).first)->getId() == (*varit1)->getId() && ((it->first).second)->getId() == (*varit2)->getId()){
	    int var1Id = (*varit1)->getId();
	    int var2Id = (*varit2)->getId();
	    objQ[var1Id][var2Id] = it->second;
	  }
	}
      }
    }
  }
  double ij;
  double ji;
  for(int i = 0; i < numVars; i++) {
    for(int j = i+1; j < numVars; j++) {
      ij = objQ[i][j];
      ji = objQ[j][i];
      objQ[i][j] = (ij+ji)/2;
      objQ[j][i] = (ij+ji)/2;
    }
  }
  
  for(int i = 0; i < numVars; i++) {
    for(int j = 0; j < numVars; j++) {
      fprintf(pFile, "%f\t", objQ[i][j]);
    }
    fprintf(pFile, "\n");
  }
  fprintf(pFile, "\n\n");

  //find objA
  if(objLF) {
    for(VariableConstIterator varit = inst->varsBegin(); varit != inst->varsEnd(); ++varit) {
      for(VariableGroupConstIterator it = objLF->termsBegin(); it != objLF->termsEnd(); ++it) {
	if((*varit)->getId() == (it->first)->getId()) {
	  objA[(*varit)->getId()] = it->second;
	}
      }
    }
  }

  for(int i = 0; i < numVars; i++)
    fprintf(pFile, "%f\t", objA[i]);
  fprintf(pFile, "\n");
  fprintf(pFile, "\n\n");

  //take care of the quadratic constraints
  for(ConstraintConstIterator cIter=inst->consBegin(); cIter!=inst->consEnd(); ++cIter) {
    FunctionType ct = (*cIter)->getFunctionType();
    if(ct == Quadratic) {
      // if it's an equality constraint
      if((*cIter)->getUb() - (*cIter)->getLb() >= -1e-6 && (*cIter)->getUb() - (*cIter)->getLb() <= 1e-6)  {
	fprintf(pFile, "%d\n", 1);
	fprintf(pFile, "%f\n\n", (*cIter)->getUb());
      }
      // if it's a <= constraint
      else if((*cIter)->getUb() <= 1e6)  {
	fprintf(pFile, "%d\n", 2);
	fprintf(pFile, "%f\n\n", (*cIter)->getUb());
      }
      else if ((*cIter)->getLb() >= -1e6) {
	fprintf(pFile, "%d\n", 3);
	fprintf(pFile, "%f\n\n", (*cIter)->getLb());	
      }

      FunctionPtr F = (*cIter)->getFunction();
      LinearFunctionPtr LF = F->getLinearFunction();
      QuadraticFunctionPtr QF = F->getQuadraticFunction();
      
      double **Q = new double* [numVars];
      for(int i = 0; i < numVars; i++) 
	Q[i] = new double[numVars];
      for(int i = 0; i < numVars; i++){
	for(int j = 0; j < numVars; j++) {
	  Q[i][j] = 0;
	}
      }
      
      double *A = new double [numVars];
      for(int i = 0; i < numVars; i++)
	A[i] = 0;
      
      //find Q
      if(QF) {
	for(VariableConstIterator varit1 = inst->varsBegin(); varit1 != inst->varsEnd(); ++varit1) {
	  for(VariableConstIterator varit2 = inst->varsBegin(); varit2 != inst->varsEnd(); ++varit2) {
	    for(VariablePairGroupConstIterator it = QF->begin(); it != QF->end(); ++it) {
	      if(((it->first).first)->getId() == (*varit1)->getId() && ((it->first).second)->getId() == (*varit2)->getId()){
		int var1Id = (*varit1)->getId();
		int var2Id = (*varit2)->getId();
		Q[var1Id][var2Id] = it->second;
	      }
	    }
	  }
	}
      }
      double ij;
      double ji;
      for(int i = 0; i < numVars; i++) {
	for(int j = i+1; j < numVars; j++) {
	  ij = Q[i][j];
	  ji = Q[j][i];
	  Q[i][j] = (ij+ji)/2;
	  Q[j][i] = (ij+ji)/2;
	}
      }
      
      for(int i = 0; i < numVars; i++) {
	for(int j = 0; j < numVars; j++) {
	  fprintf(pFile, "%f\t", Q[i][j]);
	}
	fprintf(pFile, "\n");
      }
      fprintf(pFile, "\n\n");
      
      //find A
      if(LF) {
	for(VariableConstIterator varit = inst->varsBegin(); varit != inst->varsEnd(); ++varit) {
	  for(VariableGroupConstIterator it = LF->termsBegin(); it != LF->termsEnd(); ++it) {
	    if((*varit)->getId() == (it->first)->getId()) {
	      A[(*varit)->getId()] = it->second;
	    }
	  }
	}
      }
      
      for(int i = 0; i < numVars; i++)
	fprintf(pFile, "%f\t", A[i]);
      fprintf(pFile, "\n");  
      fprintf(pFile, "\n\n");      
    }
  }
  //take care of the linear constraints
  for(ConstraintConstIterator cIter=inst->consBegin(); cIter!=inst->consEnd(); ++cIter) {
    FunctionType ct = (*cIter)->getFunctionType();
    if(ct == Linear) {
      // if it's an equality constraint
      if((*cIter)->getUb() - (*cIter)->getLb() >= -1e-6 && (*cIter)->getUb() - (*cIter)->getLb() <= 1e-6)  {
	fprintf(pFile, "%d\n", 1);
	fprintf(pFile, "%f\n\n", (*cIter)->getUb());
      }
      // if it's a <= constraint
      else if((*cIter)->getUb() <= 1e6)  {
	fprintf(pFile, "%d\n", 2);
	fprintf(pFile, "%f\n\n", (*cIter)->getUb());
      }
      else if ((*cIter)->getLb() >= -1e6) {
	fprintf(pFile, "%d\n", 3);
	fprintf(pFile, "%f\n\n", (*cIter)->getLb());	
      }

      FunctionPtr F = (*cIter)->getFunction();
      LinearFunctionPtr LF = F->getLinearFunction();
      double *A = new double [numVars];
      for(int i = 0; i < numVars; i++)
	A[i] = 0;
      if(LF) {
	for(VariableConstIterator varit = inst->varsBegin(); varit != inst->varsEnd(); ++varit) {
	  for(VariableGroupConstIterator it = LF->termsBegin(); it != LF->termsEnd(); ++it) {
	    if((*varit)->getId() == (it->first)->getId()) {
	      A[(*varit)->getId()] = it->second;
	    }
	  }
	}
      }
      
      for(int i = 0; i < numVars; i++)
	fprintf(pFile, "%f\t", A[i]);
      fprintf(pFile, "\n");  
      fprintf(pFile, "\n\n");            
    }
  }

  // get the bound matrices
  double **lb = new double *[numVars+1];
  for(int i=0; i<numVars+1; i++)
    lb[i] = new double [numVars+1];
  double **ub = new double *[numVars+1];
  for(int i=0; i<numVars+1; i++)
    ub[i] = new double [numVars+1];
  lb[0][0]=1;
  ub[0][0]=1;

  for(VariableConstIterator varit1 = inst->varsBegin(); varit1 != inst->varsEnd(); ++varit1) {
    int var1Id = (*varit1)->getId();
    int var1Lb = (*varit1)->getLb();
    int var1Ub = (*varit1)->getUb();
    lb[0][var1Id+1] = var1Lb;
    ub[0][var1Id+1] = var1Ub;
    lb[var1Id+1][0] = var1Lb;
    ub[var1Id+1][0] = var1Ub;
    
    for(VariableConstIterator varit2 = inst->varsBegin(); varit2 != inst->varsEnd(); ++varit2) {
      int var2Id = (*varit2)->getId();
      int var2Lb = (*varit2)->getLb();
      int var2Ub = (*varit2)->getUb();
      if(var2Id >= var1Id) {
	double prodLb;
	double prodUb;
	BoundsOnProduct(var1Lb, var1Ub, var2Lb, var2Ub, prodLb, prodUb);
	lb[var1Id+1][var2Id+1] = prodLb;
	ub[var1Id+1][var2Id+1] = prodUb;
	lb[var2Id+1][var1Id+1] = prodLb;
	ub[var2Id+1][var1Id+1] = prodUb;

      }
    }
  }

  //print lb
  for(int i = 0; i < numVars+1; i++) {
    for(int j = 0; j < numVars+1; j++) {
      fprintf(pFile, "%f\t", lb[i][j]);
    }
    fprintf(pFile, "\n");
  }
  fprintf(pFile, "\n\n");

  //print ub
  for(int i = 0; i < numVars+1; i++) {
    for(int j = 0; j < numVars+1; j++) {
      fprintf(pFile, "%f\t", ub[i][j]);
    }
    fprintf(pFile, "\n");
  }
  fprintf(pFile, "\n\n");

  /*
  /// 
  int newObjVarCnt;
  if(obj->getFunctionType() == Linear)
    newObjVarCnt = inst->getNumVars();
  else
    newObjVarCnt = inst->getNumVars() + 1;
  printf("newObjVarCnt = %d\n", newObjVarCnt);
  printf("inst num vars = %d\n", inst->getNumVars());
  printf("inst num cons = %d\n", inst->getNumCons());

  LPRelaxationPtr lpr = LPRelaxationPtr(new LPRelaxation());

  MultilinearHandlerPtr mhandler = MultilinearHandlerPtr(new MultilinearHandler(inst));

  bool isFeasible;
  int nCons = inst->getNumCons();
  int nVars = inst->getNumVars();
  vector<bool> c_list(nCons);
  */
}