code: def validate(self, inputs=None):
          
          # if no blocks...
          if not len(self._blocks):
              #TODO: find better error than ReliureError ?
              raise ReliureError("There is no block in this engine")
          # it block should be ok with it-self
          for block in self:
              block.validate()
          # check the inputs and outputs
          # note: fornow only the first block can have user given input
          available = set()       # set of available data
          maybe_available = set() # data that are produced be not required blocks
          # add the first block input as available data
          if inputs is not None:
              for in_name in inputs:
                  available.add(in_name)
          else:
              # no inputs given, then consider that the first block input will be given
              if self.in_name is not None:
                  for in_name in self.in_name:
                      available.add(in_name)
              else:
                  # default input name if nothing specified
                  available.add(Engine.DEFAULT_IN_NAME)
          needed = self.needed_inputs()
          miss = needed.difference(available)
          if len(miss):
              raise ReliureError("The following inputs are needed and not given: %s" % (",".join("'%s'" % in_name for in_name in miss)))
          no_need = available.difference(needed)
          if len(no_need):
              raise ReliureError("The following inputs are given but not needed: %s" % (",".join("'%s'" % in_name for in_name in no_need)))
          return
docs: Check that the blocks configuration is ok
          
          :param inputs: the names of the play inputs
          :type inputs: list of str