diff --git a/meshroom/submitters/slurmSubmitter.py b/meshroom/submitters/slurmSubmitter.py new file mode 100644 index 00000000..f2f3ecad --- /dev/null +++ b/meshroom/submitters/slurmSubmitter.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# coding:utf-8 + +import os +import json + + +from meshroom.core.desc import Level +from meshroom.core.submitter import BaseSubmitter + +currentDir = os.path.dirname(os.path.realpath(__file__)) +binDir = os.path.dirname(os.path.dirname(os.path.dirname(currentDir))) + +class Vertex: + + def __init__(self, node): + self.pid = -1 + self.node = node + self.depends = list() + +class SlurmSubmitter(BaseSubmitter): + + def __init__(self, parent=None): + super(SlurmSubmitter, self).__init__(name='Slurm', parent=parent) + self.vertices = list() + self.verticesByNode = dict() + + def start(self, node): + + nbFrames = node.size + arguments = {} + parallelArgs = '' + print('node: ', node.name) + if node.isParallelized: + pass + #blockSize, fullSize, nbBlocks = node.nodeDesc.parallelization.getSizes(node) + #parallelArgs = ' --iteration @start' + #arguments.update({'start': 0, 'end': nbBlocks - 1, 'step': 1}) + + #command='{exe} --node {nodeName} "{meshroomFile}" {parallelArgs} --extern'.format(exe='meshroom_compute', nodeName=node.name, meshroomFile=meshroomFile, parallelArgs=parallelArgs), + + def submit(self, nodes, edges, filepath): + + #build a list of nodes with dependencies + for item in nodes: + v = Vertex(item) + self.vertices.append(v) + self.verticesByNode[item] = v + + #set dependencies + for edge in edges: + node = self.verticesByNode[edge[0]] + dependency = self.verticesByNode[edge[1]] + node.depends.append(dependency) + + #While all the graph is not submitted + while True: + + #Try to find a node with all its dependencies submitted + somethingFound = False + + for vertex in self.vertices: + + #check if vertex was already launched + if vertex.pid >= 0: + continue + + #check That all dependency were launched + valid = True + for dependency in vertex.depends: + if dependency.pid < 0: + valid = False + break + + #launch + if valid: + vertex.pid = 1 + self.start(vertex.node) + somethingFound = True + + if somethingFound == False: + break + + return True