From 96114f5f5bbed49a0f7a26f4914e89bf3c2ac5e3 Mon Sep 17 00:00:00 2001 From: "Colin B. Macdonald" Date: Sat, 13 Aug 2016 23:09:22 -0700 Subject: [PATCH 1/3] Add method to convert a sym to a pyobject This is for use with the Pytave project. --- inst/@sym/pyobject.m | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 inst/@sym/pyobject.m diff --git a/inst/@sym/pyobject.m b/inst/@sym/pyobject.m new file mode 100644 index 000000000..3bd1e58e2 --- /dev/null +++ b/inst/@sym/pyobject.m @@ -0,0 +1,54 @@ +%% Copyright (C) 2016 Colin B. Macdonald +%% +%% This file is part of OctSymPy. +%% +%% OctSymPy is free software; you can redistribute it and/or modify +%% it under the terms of the GNU General Public License as published +%% by the Free Software Foundation; either version 3 of the License, +%% or (at your option) any later version. +%% +%% This software is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty +%% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +%% the GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public +%% License along with this software; see the file COPYING. +%% If not, see . + +%% -*- texinfo -*- +%% @documentencoding UTF-8 +%% @defmethod @@sym pyobject (@var{x}) +%% Convert/cast a sym object to a pyobject. +%% +%% Example: +%% @example +%% @group +%% syms x +%% f = 2*sin(x/2); +%% pyobject(f) +%% @result{} ans = [pyobject ...] +%% +%% 2*sin(x/2) +%% +%% @end group +%% @end example +%% @seealso{@@sym/char, py, @@pyobject/pyobject} +%% @end defmethod + + +function y = pyobject (x) + + y = py.sympy.S (char (x)); + + % Above is nice because it needs no imports. But downside is some + % things like NonElementaryIntegral and MatrixElement will fail. See + % e.g., commit 51a80384d5caea0db211e452d39f0b4f6b3778cc + + % Alternatively, with many imports (see python_header.py), this works: + %y = pyeval (char (x)); + +end + + +%!assert (isa (pyobject (sym ('x')), 'pyobject')) From 426a36ac7df5a124421f903f9065d8a644b5cbf3 Mon Sep 17 00:00:00 2001 From: "Colin B. Macdonald" Date: Fri, 19 May 2017 16:00:51 -0700 Subject: [PATCH 2/3] update pyobject method for more recent pytave, add doctest --- inst/@sym/pyobject.m | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/inst/@sym/pyobject.m b/inst/@sym/pyobject.m index 3bd1e58e2..8c0c17507 100644 --- a/inst/@sym/pyobject.m +++ b/inst/@sym/pyobject.m @@ -1,4 +1,4 @@ -%% Copyright (C) 2016 Colin B. Macdonald +%% Copyright (C) 2016-2017 Colin B. Macdonald %% %% This file is part of OctSymPy. %% @@ -24,31 +24,41 @@ %% Example: %% @example %% @group +%% @c doctest: +SKIP_IF(~strcmp(sympref('ipc'), 'native')) %% syms x %% f = 2*sin(x/2); %% pyobject(f) -%% @result{} ans = [pyobject ...] +%% @result{} ans = [Python object of type sympy.core.mul.Mul] %% %% 2*sin(x/2) %% %% @end group %% @end example -%% @seealso{@@sym/char, py, @@pyobject/pyobject} +%% @seealso{@@sym/sympy, py, @@pyobject/pyobject} %% @end defmethod function y = pyobject (x) - y = py.sympy.S (char (x)); + y = py.sympy.S (sympy (x)); % Above is nice because it needs no imports. But downside is some % things like NonElementaryIntegral and MatrixElement will fail. See % e.g., commit 51a80384d5caea0db211e452d39f0b4f6b3778cc % Alternatively, with many imports (see python_header.py), this works: - %y = pyeval (char (x)); + %y = pyeval (sympy (x)); end -%!assert (isa (pyobject (sym ('x')), 'pyobject')) +%!test +%! try +%! q = py.int(7); +%! have_pytave = true; +%! catch +%! have_pytave = false; +%! end +%! if (have_pytave) +%! assert (isa (pyobject (sym ('x')), 'pyobject')) +%! end From 92188199ef93e28ce57eb28972fc0443bcd78338 Mon Sep 17 00:00:00 2001 From: "Colin B. Macdonald" Date: Sat, 20 May 2017 12:50:24 -0700 Subject: [PATCH 3/3] minor changes to pyobject tests --- inst/@sym/pyobject.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/inst/@sym/pyobject.m b/inst/@sym/pyobject.m index 8c0c17507..ffa5a9e8d 100644 --- a/inst/@sym/pyobject.m +++ b/inst/@sym/pyobject.m @@ -55,10 +55,11 @@ %!test %! try %! q = py.int(7); -%! have_pytave = true; +%! have_py = true; %! catch -%! have_pytave = false; +%! have_py = false; %! end -%! if (have_pytave) +%! if (have_py) %! assert (isa (pyobject (sym ('x')), 'pyobject')) +%! assert (regexp (char (class (pyobject (sym ('x')))), 'py\..*\.Symbol')) %! end