Home : Maplesoft Products : Maple 18 : New Features in Maple 18 : Language and Programming

Language and Programming

Maple 18 includes the following enhancements to the Maple language and programming facilities: 

New URL Package

A new URL package has been added to enable downloading and uploading data across networks. The URL package supports the http, https, and ftp protocols. This package extends the functionality previously available through the HTTP package. 

For more information, see the Import/Export page. 

 

 

New InertForm Package

The InertForm package gives you tools to prevent simplification and evaluation so that you can examine and work with exactly what was entered. 

Example 

Embedded component 

For details, see the InertForm in Maple 18 page. 

 

 

Compiler Run-time Library

In Maple 18, the compiler run-time library was made thread-safe. The result is that an already-compiled procedure that is thread-safe can be run in multiple threads.   

To do this, add `option threadsafe` to the procedure before compiling it, so that the compiler knows that the procedure is thread-safe. Note that adding this option does not make anything thread-safe in itself. It is the responsibility of the code author to ensure that their procedure is writen in a thread-safe way; this option simply informs the compiler that the authored code is thread-safe. 

 

 

Random Tools

You can now generate random matrices and vectors using the RandomTools package by using the new flavors Matrix and Vector.  When generating matrices and vectors of floats and integers, these flavors are very fast. 

In addition, the list flavor has been updated to generate lists of integers and floats much faster than in previous versions of Maple. 

> RandomTools:-Generate(('Matrix')(integer, 5, 5)); 1
 
Matrix(%id = 18446744078088537022)
 
> RandomTools:-Generate(('Matrix')(polynom(integer(range = 0 .. 1), x, degree = 10), 4, 4)); 1
 
Matrix(%id = 18446744078088538102)
Matrix(%id = 18446744078088538102)
Matrix(%id = 18446744078088538102)
Matrix(%id = 18446744078088538102)
 
> RandomTools:-Generate(('Vector')(float, 10, datatype = float[8])); 1
 
Vector[column](%id = 18446744078088538222)
 
> RandomTools:-Generate(('Vector[row]')(float(digits = 4), integer(range = 5 .. 10))); 1
 
Vector[row](%id = 18446744078088538342)
 
> time[real](RandomTools:-Generate(list(integer, `^`(10, 6)))); 1
 
.136
 

In previous versions of Maple, this takes more than 5 seconds to complete.

 

Improvements to the sort Command

Improvements to the sort command in Maple 18 offer faster sorting through automatic parallel execution and new key sorting, as well as guaranteed stable sorting. 

Parallel Sort

In Maple 18, the sort command takes advantage of multiple cores. The following graph shows the timing difference between sorts of random permutations run in Maple 17 and Maple 18. 

Plot_2d 

Parallel sorting is used for all of Maple's built-in sort algorithms, automatically taking advantage of all of the cores available on your computer. When a custom comparison function is given, sort will perform the operation in serial. 

 

 

Key Sorting

Maple 18 adds support for key sorting.  Key sorting allows users to specify a function to map elements to keys. The input is then sorted by sorting the corresponding keys. For example, the following list of lists can be sorted by comparing the first element of each sublist.  

> sort([[9], [4], [7], [2], [5], [8], [3], [6], [1]], key = (proc (x) options operator, arrow; x[1] end proc)); 1
 
[[1], [2], [3], [4], [5], [6], [7], [8], [9]]
 

In previous versions of Maple, this could be achieved by using a custom comparison function. Key sorting is faster because it only requires that the key function be called O(n) times, whereas a comparison function will be called O(n*log(n)) times. In addition, by performing the underlying sort operation with the default Maple comparison function, sorting can be performed in parallel. 

The following example shows the timing difference (in seconds) between sorting with a comparison function and a key function. 

> L := [seq([i], `in`(i, combinat:-randperm(`+`(`*`(3, `*`(`^`(10, 5)))))))]; -1
 
> time[real](sort(L, proc (x, y) options operator, arrow; `<=`(x[1], y[1]) end proc)); 1
 
11.040
 
> time[real](sort(L, key = (proc (x) options operator, arrow; x[1] end proc))); 1
 
1.003
 
 

 

 

Stable Sorting

The Maple 18 sort function is now stable .  A stable sort function guarantees that equal elements are left in the same relative order in the output as in the input. This is most meaningful when sorting using a custom comparison function or a key sorting function. The following list is sorted according to the first element in the list. The lists whose first elements are equal end up in the same relative order (as shown by the second element) as specified in the input list. 

> sort([[1, 1], [2, 1], [3, 1], [1, 2], [2, 2], [3, 2], [1, 3], [2, 3], [3, 3]], proc (x, y) options operator, arrow; `<=`(x[1], y[1]) end proc); 1
 
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
 

Stable sorting is available for all built-in Maple sort algorithms and any custom comparison function that follows the guidelines outlined in the sort documentation. By default, the comparison function must be a non-strict (less than or equal to) comparison function. To use a strict (less than) comparison function, one must specify that using the strict option. 

> sort([[1, 1], [2, 1], [3, 1], [1, 2], [2, 2], [3, 2], [1, 3], [2, 3], [3, 3]], strict = (proc (x, y) options operator, arrow; `<`(x[1], y[1]) end proc)); 1
 
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
 

String Tools

There are three new commands in the StringTools package: 

  • DifferencePositions: Convert a string to a list of characters.
  • IsDerangement: Test whether a string is a derangement of another string.  
  • Snarf: Extract a prefix consisting of specified characters from a string.
 
> StringTools:-DifferencePositions(
 
1, 2, 3, 4
 
> StringTools:-IsDerangement(
 
true
 
> StringTools:-Snarf(
 
ti
 

Improvements to the Code Editor

Some usability improvements have been made to the Code Editor. For details, see Embedded Component Enhancements


Interface and Kernelopts

A new interface variable, worksheetdir, returns the path to the directory of the active worksheet.  

Two new kernel options, gctotaltime and gctotaltime[real], return the total amount of time spent performing garbage collection in CPU time and real time.


indexorder option for entries and indices

The entries and indices procedures accept a new option, indexorder.  The indexorder option causes the returned elements to be sorted by the values of the index. This is most useful for the entries command, where one wants the the entires of a table sorted based on the indices of the table. For example 

 

>
 
 
> entries(t); 1
 
 
> entries(t, indexorder); 1