docs: def is_valid(value, valid_values):
          """
          check is the value is valid
          Args:
              value: value to be tested
              valid_values: allowed valid values (type or list of values)
  
          Returns:
  
          """
  
          valid = False
  
          if isinstance(valid_values, type) and type(value) is valid_values:
              valid = True
          elif isinstance(valid_values, type) and valid_values == float and type(value) == int:
              #special case to allow ints as float inputs
              valid = True
          elif isinstance(value, dict) and isinstance(valid_values, dict):
              # check that all values actually exist in valid_values
              # assert value.keys() & valid_values.keys() == value.keys() # python 3 syntax
              assert set(value.keys()) & set(valid_values.keys()) == set(value.keys()) # python 2
              # valid = True
              for k ,v in value.items():
                  valid = Parameter.is_valid(v, valid_values[k])
                  if valid ==False:
                      break
  
          elif isinstance(value, dict) and valid_values == Parameter:
              valid = True
  
          elif isinstance(valid_values, list) and value in valid_values:
              valid = True
  
          return valid