Example #1
0
 void generateCombinations(vector<int>& nums, vector<vector<int>>& ans, vector<int>& cur, int idx, int n,
                           int cur_sum, int target) {
     if(idx == n) {
         if(cur_sum == target) {
             ans.push_back(cur);
         }
         return;
     }
     generateCombinations(nums, ans, cur, idx + 1, n, cur_sum, target);
     if(cur_sum + nums[idx] <= target) {
         cur.push_back(nums[idx]);
         generateCombinations(nums, ans, cur, idx, n, cur_sum + nums[idx], target);
         cur.pop_back();
     }
 }
std::vector<std::string> generateCombinations(std::vector<std::string> inputVector){
    
    if(inputVector.size() == 0){
        std::vector<std::string> output;
        output.push_back("");
        return output;
    }
    else if (inputVector.size() == 1){
        std::vector<std::string> output;
        std::string currentString = inputVector[0];
        for(int n = 0; n < currentString.size(); n++){output.push_back(currentString.substr(n,1));}
        return output;
    }
    else if(inputVector.size() > 1){

        std::vector<std::string> output;
        std::string currentString = inputVector.back();
        inputVector.pop_back();
        std::vector<std::string> previousOutput = generateCombinations(inputVector);

        for(int k = 0; k < currentString.size(); k++){
            for(int m = 0; m < previousOutput.size(); m++){
                output.push_back(previousOutput[m] + currentString[k]);
            }
        }
        return output;
    }

    std::vector<std::string> dummy; return dummy;
}
Example #3
0
void EFMGenerator::generateCombinations(int metaboliteIndex, int inputCount, int outputCount) {
   bptInput.init();
   bptOutput.init();
   bptNonpart.init();
   //Identify input, output and non-participating pathways for the given metabolite
   int prevSize = pathways.size();
   for (int i = prevSize - 1, in = 0, out = inputCount; i >= 0; i--) {
      if (pathways[i].isInput(metaboliteIndex)) {
         pathwaysPtr[in++] = &pathways[i];
         bptInput.addPathway(&pathways[i]);
      } else if (pathways[i].isOutput(metaboliteIndex)) {
         pathwaysPtr[out++] = &pathways[i];
         bptOutput.addPathway(&pathways[i]);
      } else {
         bptNonpart.addPathway(&pathways[i]);
      }
   }
   //Create reversible trees for inputs and outputs
   ReversibleTree inputTree(pathwaysPtr, 0, inputCount);
   ReversibleTree outputTree(pathwaysPtr, inputCount, inputCount + outputCount);
   //Generate combinations
   generateCombinations(inputTree.getRoot(), outputTree.getRoot());
   //Update list of pathways in the network
   for (int i = pathways.size() - 1; i >= prevSize; i--) {
      pathways[i].updateMetaboliteCoefficients(metaboliteIndex);
   }
   for (int i = prevSize - 1; i >= 0; i--) {
      if (pathways[i].isInput(metaboliteIndex) || pathways[i].isOutput(metaboliteIndex)) {
         pathways.remove(i);
      }
   }
   clearBPTNodePool();
   clearRevNodePool();
}
Example #4
0
void EFMGenerator::computeEFMs() {
  while(metabs > exterCount) {
	int target = selectMetaboliteToEliminate();
	
	generateCombinations(target);   //Invisibly adds to candidatePathways.
	removeIOPathwaysForMetabolite(target);//Invisibly modifies allPathways.

	removeDependentPathways(); //The big 'un.
	
	addCandidatePathwaystoAllPathways(); //And again.
  }
}
int main(){

    std::string A = "abc"; 
    std::string B = "d";
    std::string C = "gh";
    std::string D = "xyz";

    std::vector<std::string> testInput; testInput.push_back(A); testInput.push_back(B); testInput.push_back(C); testInput.push_back(D);

    std::vector<std::string> testOutput = generateCombinations(testInput);
    for(int k = 0; k < testOutput.size(); k++){std::cout << testOutput[k] << std::endl;}

    return 0;
}
Example #6
0
void EFMGenerator::generateCombinations(ReversibleTreeNode* input, ReversibleTreeNode* output) {
   ReactionBitData comboLabel;
   rbdOr(comboLabel, input->getBitsUsed(), output->getBitsUsed());
   if (!isValidPathway(comboLabel)) {
      return;
   }
   if (input->isLeaf()) {
      if (output->isLeaf()) {
         if (bptInput.isSuperSet(comboLabel, input->getBitsUsed()) || bptOutput.isSuperSet(comboLabel, output->getBitsUsed()) || bptNonpart.isSuperSet(comboLabel)) {
            return;
         }
         int iStart = input->getStart(), iEnd = input->getEnd();
         int oStart = output->getStart(), oEnd = output->getEnd();
         Pathway *combo = ++pathways;
         Pathway *in;
         Pathway *out;
         for (int i = iStart; i < iEnd; i++) {
            for (int o = oStart; o < oEnd; o++) {
               in = input->getPathway(i);
               out = output->getPathway(o);
               combo->setParents(in, out);
               combinationsGenerated++;
               if (!(bptInput.isSuperSet(combo, in) || bptOutput.isSuperSet(combo, out) || bptNonpart.isSuperSet(combo))) {
                  combinationsStored++;
                  combo = ++pathways;
               }
            }
         }
         --pathways;
      } else {
         generateCombinations(input, output->getNode0());
         generateCombinations(input, output->getNode1());
      }
   } else {
      if (output->isLeaf()) {
         generateCombinations(input->getNode0(), output);
         generateCombinations(input->getNode1(), output);
      } else {
         generateCombinations(input->getNode0(), output->getNode0());
         generateCombinations(input->getNode0(), output->getNode1());
         generateCombinations(input->getNode1(), output->getNode0());
         generateCombinations(input->getNode1(), output->getNode1());
      }
   }
}
Example #7
0
void EFMGenerator::removeNextMetabolite() {
   int metaboliteIndex, inputCount, outputCount;
   //Find next metabolite to remove
   findNextMetaboliteToRemove(metaboliteIndex, inputCount, outputCount);
   //Decrement number of remaining metabolites
   numMetabolitesRemaining--;
   //Move the metabolite to the end of unprocessed metabolites
   reorderMetabolites(metaboliteIndex, numMetabolitesRemaining);
   metaboliteIndex = numMetabolitesRemaining;
   long totalCombinations = inputCount;
   totalCombinations *= outputCount;
   cout << metabolites[metaboliteIndex] << "\t" << inputCount << "\t" << outputCount << "\t" << (pathways.size() - inputCount - outputCount) << "\t" << totalCombinations << "\t";
   if (inputCount == 0) {
      removeUnusedOutputs(metaboliteIndex);
   } else if (outputCount == 0) {
      removeUnusedInputs(metaboliteIndex);
   } else {
      generateCombinations(metaboliteIndex, inputCount, outputCount);
   }
}
Example #8
0
 vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
     vector<vector<int>> ans;
     vector<int> cur;
     generateCombinations(candidates, ans, cur, 0, candidates.size(), 0, target);
     return ans;
 }
int main() {
    int N, K;
    scanf("%d %d", &N, &K);
    generateCombinations(N, K);
    return 0;
}