changeset 33:1d7bab3bc745 task

Documentation
author David Grundberg <individ@acc.umu.se>
date Tue, 05 May 2009 20:57:54 +0200
parents def8098ddb9e
children 24e1734d26b0
files ChangeLog INSTALL NEWS README
diffstat 4 files changed, 295 insertions(+), 331 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue May 05 20:57:24 2009 +0200
+++ b/ChangeLog	Tue May 05 20:57:54 2009 +0200
@@ -1,3 +1,12 @@
+2009-05-05  David Grundberg  <individ@acc.umu.se>
+
+	* python_to_octave.cc: Function pydict_to_octmap modified.
+	* m4/ax_octave.m4, m4/ax_python_devel.m4: New files.
+	* m4/ax_python.m4: Removed.
+	* m4/ax_boost_python.m4, README, INSTALL: Rewritten.
+	* configure.ac, setup.py.in, Jamfile.in, Makefile.am: Adjusted to
+	new Autoconf macros.
+
 2008-11-17  Håkan Fors Nilsson  <c04hfn@cs.umu.se>
 
 	* octave_to_python.cc: Added functions octcell_to_pyobject and 
@@ -39,6 +48,6 @@
 
 Local Variables:
 coding: utf-8
-fillcolumn: 72
+fill-column: 74
 End:
-vim: set textwidth=72 noexpandtab :
+vim: set textwidth=74 noexpandtab :
--- a/INSTALL	Tue May 05 20:57:24 2009 +0200
+++ b/INSTALL	Tue May 05 20:57:54 2009 +0200
@@ -1,237 +1,145 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-These are generic installation instructions. See README for pytave
-instructions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
+Building instructions
 =====================
 
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
+You can use either Python distutils, GNU Automake or Boost BJam to
+build pytave. The configure script outputs files for all these build
+systems. Autoconf's VPATH is supported on all build systems.
+
+    Use the configure script to set up Octave and Boost::Python
+paths. Run `./configure --help' for more info.
+
+Dependencies
+============
+
+Configuring:
+	an sh shell capable of running `configure'
 
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
+Building:
+	Python's distutils or
+	make or
+	BJam
 
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+Linked and tested with:
+    Python 2.4
+    Boost::Python 1.33
+    Octave 3.0.2
 
-   *Note Defining Variables::, for more details.
+Bootstraping from Bazaar trunk
+==============================
 
-Compiling For Multiple Architectures
-====================================
+  1. `bzr branch lp:pytave'
+
+  2. `autoreconf --install'
+
+  3. `./configure'
 
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
+Autotools
+=========
+
+The Autotools build system need not be installed to build the
+module. You need `make' and all library dependencies though.
+
+  1. Create the `Makefile' by typing:
+	 `./configure --prefix=/directory/where/you/want/the/module/file'
+
+  2. Type `make' to build the extention module.
+
+  3. To copy the pytave dynamic library to the prefix, type
+     `make install'
 
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
+BJam
+====
+
+BJam must be installed in order to build the module. You also need a
+proper `user-config.jam' file in your home directory.
+
+  1. Create `Jamfile' and `project-root.jam' by typing `./configure'
 
-Installation Names
-==================
+  2. Use your `bjam' command to build the extention module. 
+
+user-config.jam
+===============
+
+For your convenience, here the content of a typical ~/user-config.jam
+on a GNU/Linux system:
+
+using gcc ;
+using python : 2.5 ;
 
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
+Distutils
+=========
+
+  1. Create the `setup.py' file by typing `./configure'
+
+  2. Run `python setup.py build' to build and package the extention
+     module together with the pure Python files.
+
+Running from build directory
+============================
 
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
+Pytave is made up of three parts. The `pytave' package, the
+`pytave/pytave' module and the `pytave/_pytave' extention. When the
+user uses `import pytave', the pytave package __init__ script loads
+both the module and the extention. It is important that they both can
+be found. 
+
+  1. Follow the Distutils build instructions. A complete Python
+     package directory called `pytave' is created in
+     `build/lib.something'
 
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
+  2. Start the Python interactive interpreter with
+     `PYTHONPATH=build/lib.linux-i686-2.4/ python' (with appropiate
+     changes for your system.)
+
+  3. In the interpreter you can now access Octave through Python:
+
+import pytave
+import Numeric
+pytave.feval(1, "cos", 0)
+b = pytave.addpath(".")
+pytave.feval(1, "testfile", 42)
 
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+     (Observe that there is a testfile.m file in the distribution.)
+
+    Using BJam or Automake instead of Distutils, you load the
+`pytave/pytave' module and the extention instead of the whole
+package. Using `import pytave' now calls the module directly, but the
+difference is transparent to the user.
 
-Optional Features
-=================
+    Basically all you want to do is load Python with shared library
+for the pytave extention (called `pytave/_pytave') and the native
+`pytave/pytave' module. BJam creates shared library in the
+`bin/something/something' directory, while Autotools hide a working
+shared library in the `.libs' directory. The contents of the `pytave'
+package is stored in the directory `package' of the source
+package. This is an example for an Autotools build.
+
+  1. Follow the Autotools build instructions.
 
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
+  2. Start the Python interpreter with a Python path set to a path
+     containing `_pytave.so' and the `package' directory. A common way
+     to do this with the bash shell is to execute this command:
+     `PYTHONPATH=.libs:package python'.
+
+Installing with distutils
+=========================
 
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
+  1. Run `python setup.py install'
 
-Specifying the System Type
+Creating a source dist
+======================
+
+  1. Run `make distcheck'
+
+Hint about foreign systems
 ==========================
 
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
+If you are running on a system incapable of executing the configure
+scripts (e.g. a Microsoft Windows system), you may want to try
+installing the `MinGW' and `MSYS' packages, and build everything
+inside that environment.  This isn't for the faint of hearted though,
+since you need/want to build Octave too.  It is probably easier than
+trying to build without configure scripts, that's all.  There are no
+guarentees that it will build at all, it has not been tested.
 
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
-
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
+EOF.
\ No newline at end of file
--- a/NEWS	Tue May 05 20:57:24 2009 +0200
+++ b/NEWS	Tue May 05 20:57:54 2009 +0200
@@ -1,9 +1,8 @@
 Version 0.1-bzr 
 
-* Added functionality for one dimensional cell arrays. Python list represents
-a one dimensional cell array. Pytave will throw an exception if a cell array 
-has higher dimensions. 
+* Added functionality for one-row cell arrays.  The Python list is
+  converted to a one-row cell array and vice versa.
 
-* Added functionality for structs, a Octave struct is represented by a Python
-dictionary. The implementation tries to be as true as possible to Octave's 
-struct constructor. 
+* Added functionality for structs.  The Python distionary is converted
+  to a Octave struct and vice versa.  The implementation tries to be
+  as true as possible to Octave's struct constructor.
--- a/README	Tue May 05 20:57:24 2009 +0200
+++ b/README	Tue May 05 20:57:54 2009 +0200
@@ -1,148 +1,196 @@
-pytave README
-*************
+-*- coding:utf-8 -*-
 
-Building instructions
-=====================
+Pytave README
+
+For installation instructions specific for Pytave, please see the
+INSTALL file.
 
-You can use either Python distutils, GNU Automake or Boost BJam to
-build pytave. The configure script outputs files for all these build
-systems. Autoconf's VPATH is supported on all build systems.
+Contents of this document
+=========================
 
-    Use the configure script to set up Octave and Boost::Python
-paths. Run `./configure --help' for more info.
+1. What is Pytave?
+2. Gotchas
+3. Pytave and multi-threading
+4. Python/Octave cheat sheet
 
-Dependencies
-============
-
-Configuring:
-	an sh shell capable of running `configure'
+What is Pytave?
+***************
 
-Building:
-	Python's distutils or
-	make or
-	BJam
+Pytave enables Python scripts to use existing m-files (Octave/Matlab
+scripts) for numerical calculations.  The Octave language interpreter
+is embedded as a module to Python.
+
+Example use
+===========
+
+Calling Octave code in the interactive Python interpreter:
 
-Linked and tested with:
-    Python 2.4
-    Boost::Python 1.33
-    Octave 3.0.2
+>>> import pytave
+>>> pytave.feval(1, "cos", 0)
+(1.0,)
+
+Goals
+=====
 
-Bootstraping from Bazaar trunk
-==============================
+Pytave strives to uphold these points
 
-  1. `bzr branch lp:pytave'
+  * Good out of the box experience
 
-  2. `autoreconf --install'
-
-  3. `./configure'
+  * Good-natured implicit type conversions, no strange PyApple ->
+    octave_orange -> PyBanana chains
 
-Autotools
-=========
+Features
+========
 
-The Autotools build system need not be installed to build the
-module. You need `make' and all library dependencies though.
+A short list of what Pytave is capable of
 
-  1. Create the `Makefile' by typing:
-	 `./configure --prefix=/directory/where/you/want/the/module/file'
+  * Implicit type conversions between Python and Octave.  Supports all
+    Numeric integer, real double (and possibly real float) matrices
 
-  2. Type `make' to build the extention module.
+  * Architecture independent - no assumption on endian type or integer
+    sizes
 
-  3. To copy the pytave dynamic library to the prefix, type
-     `make install'
+  * Supports cell <-> list and struct <-> dict conversions.
 
-BJam
-====
+Project homepage
+================
 
-BJam must be installed in order to build the module. You also need a
-proper `user-config.jam' file in your home directory.
+https://launchpad.net/pytave
+
+Using/hacking
+=============
 
-  1. Create `Jamfile' and `project-root.jam' by typing `./configure'
+You need the Bazaar version control software (bzr).  Branch from trunk
+with:
 
-  2. Use your `bjam' command to build the extention module. 
+  $ bzr branch lp:pytave
 
-user-config.jam
-===============
+   You will now have a directory called `pytave' with source code for
+the module.  Read the INSTALL file for building instructions.
 
-For your convenience, here the content of a typical ~/user-config.jam
-on a GNU/Linux system:
+Gotchas
+*******
 
-using gcc ;
-using python : 2.5 ;
+Unfortunately, the implicit conversion is not bijective (there is not
+a one-to-one relation between Octave and Python values).  Pytave users
+should be aware of the following cases.
 
-Distutils
-=========
+Numeric row vectors to Octave matrices
+======================================
 
-  1. Create the `setup.py' file by typing `./configure'
+Numeric row vectors are converted to Octave 1xN matrices; returned 1xN
+matrices will become 1xN numerical arrays, not row vectors. As an
+example, a Numeric array with shape == (3,) will become (1, 3) when
+converted back and forth.
 
-  2. Run `python setup.py build' to build and package the extention
-     module together with the pure Python files.
-
-Running from build directory
+Octave cells to Python lists
 ============================
 
-Pytave is made up of three parts. The `pytave' package, the
-`pytave/pytave' module and the `pytave/_pytave' extention. When the
-user uses `import pytave', the pytave package __init__ script loads
-both the module and the extention. It is important that they both can
-be found. 
+Only row cell arrays can be converted to Python lists.
+
+Python dictionaries to Octave structures
+========================================
+
+Dictionaries converted to structures must only have string keys.  This
+is because Octave structures only allow string keys.  Keys must also
+be valid Octave identifiers.
+
+   As Octave structures are built using cells, simple variables are
+upgraded to cells when a dictionary is converted.  A dictionary
 
-  1. Follow the Distutils build instructions. A complete Python
-     package directory called `pytave' is created in
-     `build/lib.something'
+{"name": "Pytave"}
+
+thus will become
 
-  2. Start the Python interactive interpreter with
-     `PYTHONPATH=build/lib.linux-i686-2.4/ python' (with appropiate
-     changes for your system.)
+ans =
+{
+  name = Pytave
+}
+
+in Octave.  In this listing, Octave is hiding the fact that the value
+is wrapped in a cell.  Converted back, cells are converted to Python
+lists. The re-converted Python dictionary will read
 
-  3. In the interpreter you can now access Octave through Python:
+{"name": ["Pytave"]}
+
+which is natural effect because of the way Octave handles structures.
+
+   The list values in dictionaries to be converted must be of equal
+length.  All restrictions demanded by the Octave `struct' built-in
+applies.
+
+Pytave and multi-threading
+**************************
 
-import pytave
-import Numeric
-pytave.feval(1, "cos", 0)
-b = pytave.addpath(".")
-pytave.feval(1, "testfile", 42)
+Pytave does not handle reentrant calls.  It is not thread-safe, and
+you cannot make several Pytave calls in parallel.  There are no safety
+harnesses in Pytave (unlike e.g. PySqlite), and Pytave will not stop
+you if you try to make concurrent calls.  The behavior is undefined.
+It is not possible to run several calculations in parallel.
 
-     (Observe that there is a testfile.m file in the distribution.)
+   That being said, it is possible to do other things while one Pytave
+call is running.  Pytave is aware of the Global Interpreter Lock.  The
+lock will be released while the Octave interpreter is running,
+allowing you to have other Python threads to run in parallel with the
+one Octave call.
 
-    Using BJam or Automake instead of Distutils, you load the
-`pytave/pytave' module and the extention instead of the whole
-package. Using `import pytave' now calls the module directly, but the
-difference is transparent to the user.
+Python/Octave cheat sheet
+*************************
 
-    Basically all you want to do is load Python with shared library
-for the pytave extention (called `pytave/_pytave') and the native
-`pytave/pytave' module. BJam creates shared library in the
-`bin/something/something' directory, while Autotools hide a working
-shared library in the `.libs' directory. The contents of the `pytave'
-package is stored in the directory `package' of the source
-package. This is an example for an Autotools build.
+Octave and Python share some syntax elements, which unfortunately
+makes it harder to distinguish between the languages.  Here are some
+examples in both languages, showing how to build related constructs.
+
+Create a 2x3 matrix
+===================
+
+octave:1> [1, 1, 1; 2, 2, 2]
+python>>> array([[1, 1, 1], [2, 2, 2]])
+
+Create a 3x2 matrix
+===================
 
-  1. Follow the Autotools build instructions.
+octave:1> [1, 1; 2, 2; 3, 3]
+python>>> array([[1, 1], [2, 2], [3, 3]])
+
+Create a 1x3 matrix
+===================
 
-  2. Start the Python interpreter with a Python path set to a path
-     containing `_pytave.so' and the `package' directory. A common way
-     to do this with the bash shell is to execute this command:
-     `PYTHONPATH=.libs:package python'.
+octave:1> [1, 1, 1]
+python>>> array([[1, 1, 1]])
 
-Installing with distutils
-=========================
+Create a row vector
+===================
+
+Not applicable to Octave.
+python>>> array([1, 1, 1])
 
-  1. Run `python setup.py install'
+Note: Python row vectors will be converted to Octave 1xN matrices.
 
-Creating a source dist
-======================
+Create a 3x1 matrix
+===================
 
-  1. Run `make distcheck'
+octave:1> [1; 2; 3]
+python>>> array([[1], [2], [3]])
 
-Hint about foreign systems
-==========================
+Create a 1x1 structure/dictionary
+=================================
+
+octave:1> struct("x", 1, "y", 2)
+python>>> {"x": 1, "y": 2}
 
-If you are running on a system incapable of executing the configure
-scripts (e.g. a Microsoft Windows system), you may want to try
-installing the `MinGW' and `MSYS' packages, and build everything
-inside that environment. This isn't for the faint of hearted though,
-since you need/want to build Octave too. It is probably easier than
-trying to build without configure scripts, that's all. There are no
-guarentees that it will build at all, it has not been tested.
+Create a 1x2 structure array/dictionary containing lists of length 2
+====================================================================
+
+octave:1> struct("firstname", {"David", "Håkan"}, ...
+                 "lastname", {"Grundberg", "Fors Nilsson"})
+python>>> {"firstname": ["David", "Håkan"], \
+           "lastname": ["Grundberg", "Fors Nilsson"]}
 
-EOF.
\ No newline at end of file
+Create a 1x3 cell array/list
+============================
+
+octave:1> {"foo", "bar", "baz"}
+python>>> ["foo", "bar", "baz"]
+
+EOF.