PageRenderTime 56ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/dolfin/swig/parameter/post.i

https://bitbucket.org/pefarrell/dolfin
Swig | 331 lines | 288 code | 42 blank | 1 comment | 0 complexity | 6102508f6df4e996525ff41a4cc7d791 MD5 | raw file
  1. /* -*- C -*- */
  2. // Copyright (C) 2006-2009 Johan Hake
  3. //
  4. // This file is part of DOLFIN.
  5. //
  6. // DOLFIN is free software: you can redistribute it and/or modify
  7. // it under the terms of the GNU Lesser General Public License as published by
  8. // the Free Software Foundation, either version 3 of the License, or
  9. // (at your option) any later version.
  10. //
  11. // DOLFIN is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. // GNU Lesser General Public License for more details.
  15. //
  16. // You should have received a copy of the GNU Lesser General Public License
  17. // along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
  18. //
  19. // First added: 2009-05-12
  20. // Last changed: 2012-08-09
  21. //
  22. // ===========================================================================
  23. // SWIG directives for the DOLFIN parameter kernel module (post)
  24. //
  25. // The directives in this file are applied _after_ the header files of the
  26. // modules has been loaded.
  27. // ===========================================================================
  28. // ---------------------------------------------------------------------------
  29. // Modifications of Parameter interface
  30. // ---------------------------------------------------------------------------
  31. %extend dolfin::Parameter
  32. {
  33. %pythoncode%{
  34. def warn_once(self, msg):
  35. cls = self.__class__
  36. if not hasattr(cls, '_warned'):
  37. cls._warned = set()
  38. if not msg in cls._warned:
  39. cls._warned.add(msg)
  40. print msg
  41. def value(self):
  42. val_type = self.type_str()
  43. if val_type == "string":
  44. return str(self)
  45. elif val_type == "int":
  46. return int(self)
  47. elif val_type == "bool":
  48. return bool(self)
  49. elif val_type == "double":
  50. return float(self)
  51. else:
  52. raise TypeError, "unknown value type '%s' of parameter '%s'"%(val_type, self.key())
  53. def get_range(self):
  54. val_type = self.type_str()
  55. if val_type == "string":
  56. local_range = self._get_string_range()
  57. if len(local_range) == 0:
  58. return
  59. return local_range
  60. elif val_type == "int":
  61. local_range = self._get_int_range()
  62. if local_range[0] == 0 and local_range[0] == local_range[0]:
  63. return
  64. return local_range
  65. elif val_type == "bool":
  66. return
  67. elif val_type == "double":
  68. from logging import DEBUG
  69. local_range = self._get_double_range()
  70. if local_range[0] == 0 and local_range[0] == local_range[0]:
  71. return
  72. return local_range
  73. else:
  74. raise TypeError, "unknown value type '%s' of parameter '%s'"%(val_type, self.key())
  75. def data(self):
  76. return self.value(), self.get_range(), self.access_count(), self.change_count()
  77. %}
  78. }
  79. // ---------------------------------------------------------------------------
  80. // Modifications of Parameters interface
  81. // ---------------------------------------------------------------------------
  82. %feature("docstring") dolfin::Parameters::_parse "Missing docstring";
  83. %extend dolfin::Parameters
  84. {
  85. void _parse(PyObject *op)
  86. {
  87. if (PyList_Check(op))
  88. {
  89. int i;
  90. int argc = PyList_Size(op);
  91. char **argv = (char **) malloc((argc+1)*sizeof(char *));
  92. for (i = 0; i < argc; i++)
  93. {
  94. PyObject *o = PyList_GetItem(op,i);
  95. if (PyString_Check(o))
  96. argv[i] = PyString_AsString(o);
  97. else
  98. {
  99. free(argv);
  100. throw std::runtime_error("list must contain strings");
  101. }
  102. }
  103. argv[i] = 0;
  104. self->parse(argc, argv);
  105. free(argv);
  106. }
  107. else
  108. throw std::runtime_error("not a list");
  109. }
  110. %pythoncode%{
  111. def add(self,*args):
  112. """Add a parameter to the parameter set"""
  113. if len(args) == 2 and isinstance(args[1],bool):
  114. self._add_bool(*args)
  115. else:
  116. self._add(*args)
  117. def parse(self,argv=None):
  118. "Parse command line arguments"
  119. if argv is None:
  120. import sys
  121. argv = sys.argv
  122. self._parse(argv)
  123. def keys(self):
  124. "Returns a list of the parameter keys"
  125. ret = self._get_parameter_keys()
  126. ret += self._get_parameter_set_keys()
  127. return ret
  128. def iterkeys(self):
  129. "Returns an iterator for the parameter keys"
  130. for key in self.keys():
  131. yield key
  132. def __iter__(self):
  133. return self.iterkeys()
  134. def values(self):
  135. "Returns a list of the parameter values"
  136. return [self[key] for key in self.keys()]
  137. def itervalues(self):
  138. "Returns an iterator to the parameter values"
  139. return (self[key] for key in self.keys())
  140. def items(self):
  141. return zip(self.keys(),self.values())
  142. def iteritems(self):
  143. "Returns an iterator over the (key, value) items of the Parameters"
  144. for key, value in self.items():
  145. yield key, value
  146. def set_range(self, key, *arg):
  147. "Set the range for the given parameter"
  148. if key not in self._get_parameter_keys():
  149. raise KeyError, "no parameter with name '%s'"%key
  150. self._get_parameter(key).set_range(*arg)
  151. def get_range(self, key):
  152. "Get the range for the given parameter"
  153. if key not in self._get_parameter_keys():
  154. raise KeyError, "no parameter with name '%s'"%key
  155. return self._get_parameter(key).get_range()
  156. def __getitem__(self, key):
  157. "Return the parameter corresponding to the given key"
  158. if key in self._get_parameter_keys():
  159. return self._get_parameter(key).value()
  160. if key in self._get_parameter_set_keys():
  161. return self._get_parameter_set(key)
  162. raise KeyError, "'%s'"%key
  163. def __setitem__(self, key, value):
  164. "Set the parameter 'key', with given 'value'"
  165. if key not in self._get_parameter_keys():
  166. raise KeyError, "'%s' is not a parameter"%key
  167. if not isinstance(value,(int,str,float,bool)):
  168. raise TypeError, "can only set 'int', 'bool', 'float' and 'str' parameters"
  169. par = self._get_parameter(key)
  170. if isinstance(value,bool):
  171. par._assign_bool(value)
  172. else:
  173. par._assign(value)
  174. def update(self, other):
  175. "A recursive update that handles parameter subsets correctly."
  176. if not isinstance(other,(Parameters, dict)):
  177. raise TypeError, "expected a 'dict' or a '%s'"%Parameters.__name__
  178. for key, other_value in other.iteritems():
  179. self_value = self[key]
  180. if isinstance(self_value, Parameters):
  181. self_value.update(other_value)
  182. else:
  183. setattr(self, key, other_value)
  184. def to_dict(self):
  185. """Convert the Parameters to a dict"""
  186. ret = {}
  187. for key, value in self.iteritems():
  188. if isinstance(value, Parameters):
  189. ret[key] = value.to_dict()
  190. else:
  191. ret[key] = value
  192. return ret
  193. def copy(self):
  194. "Return a copy of it self"
  195. return Parameters(self)
  196. def option_string(self):
  197. "Return an option string representation of the Parameters"
  198. def option_list(parent,basename):
  199. ret_list = []
  200. for key, value in parent.iteritems():
  201. if isinstance(value, Parameters):
  202. ret_list.extend(option_list(value,basename + key + '.'))
  203. else:
  204. ret_list.append(basename + key + " " + str(value))
  205. return ret_list
  206. return " ".join(option_list(self,"--"))
  207. def __str__(self):
  208. "p.__str__() <==> str(x)"
  209. return self.str(False)
  210. __getattr__ = __getitem__
  211. __setattr__ = __setitem__
  212. def iterdata(self):
  213. """Returns an iterator of a tuple of a parameter key together with its value"""
  214. for key in self.iterkeys():
  215. yield key, self.get(key)
  216. def get(self, key):
  217. """Return all data available for a certain parameter
  218. The data is returned in a tuple:
  219. value, range, access_count, change_count = parameters.get('name')
  220. """
  221. if key in self._get_parameter_keys():
  222. return self._get_parameter(key).data()
  223. if key in self._get_parameter_set_keys():
  224. return self._get_parameter_set(key)
  225. raise KeyError, "'%s'"%key
  226. %}
  227. }
  228. %pythoncode%{
  229. old_init = Parameters.__init__
  230. def __new_Parameter_init__(self,*args,**kwargs):
  231. """Initialize Parameters
  232. Usage:
  233. Parameters()
  234. create empty parameter set
  235. Parameters(name)
  236. create empty parameter set with given name
  237. Parameters(other_parameters)
  238. create copy of parameter set
  239. Parameters(name, dim=3, tol=0.1, foo="Foo")
  240. create parameter set with given parameters
  241. Parameters(name, dim=(3, 0, 4), foo=("Foo", ["Foo", "Bar"])
  242. create parameter set with given parameters and ranges
  243. """
  244. if len(args) == 0:
  245. old_init(self, "parameters")
  246. elif len(args) == 1 and isinstance(args[0], (str,type(self))):
  247. old_init(self, args[0])
  248. else:
  249. raise TypeError, "expected a single optional argument of type 'str' or ''"%type(self).__name__
  250. if len(kwargs) == 0:
  251. return
  252. from numpy import isscalar
  253. for key, value in kwargs.iteritems():
  254. if isinstance(value,type(self)):
  255. self.add(value)
  256. elif isinstance(value,tuple):
  257. if isscalar(value[0]) and len(value) == 3:
  258. self.add(key, *value)
  259. elif isinstance(value[0], str) and len(value) == 2:
  260. if not isinstance(value[1], list):
  261. raise TypeError, "expected a list as second item of tuple, when first is a 'str'"
  262. self.add(key, *value)
  263. else:
  264. raise TypeError,"expected a range tuple of size 2 for 'str' values and 3 for scalars"
  265. else:
  266. self.add(key,value)
  267. Parameters.__init__ = __new_Parameter_init__
  268. %}
  269. // Expose the global variable parameters for the Python interface
  270. // NOTE: Because parameters are stored using shared_ptr we need to
  271. // wrap the global parameters as a shared_ptr
  272. %fragment("NoDelete");
  273. %inline %{
  274. SWIG_SHARED_PTR_QNAMESPACE::shared_ptr<dolfin::Parameters> get_global_parameters()
  275. {
  276. return SWIG_SHARED_PTR_QNAMESPACE::shared_ptr<dolfin::Parameters>(dolfin::reference_to_no_delete_pointer(dolfin::parameters));
  277. }
  278. %}
  279. %pythoncode%{
  280. parameters = _common.get_global_parameters()
  281. del _common.get_global_parameters
  282. %}