File: [local] / OpenXM / src / asir-contrib / packages / src / mathematica.rr (download)
Revision 1.1, Fri Apr 8 05:56:47 2005 UTC (19 years, 1 month ago) by takayama
Branch: MAIN
CVS Tags: R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, KNOPPIX_2006, HEAD, DEB_REL_1_2_3-9
Renaming:
dsolv --> dsolv.rr
gnuplot --> gnuplot.rr
longname --> longname.rr
m --> mathematica.rr
om --> om.rr
phc --> phc.rr
sm1 --> sm1.rr
tigers --> tigers.rr
|
/*&jp \documentclass{jarticle}
\begin{document}
*/
/*$OpenXM: OpenXM/src/asir-contrib/packages/src/mathematica.rr,v 1.1 2005/04/08 05:56:47 takayama Exp $ */
/* Old: m, see Attic */
/* Use oxweave to generate documents on this source code
Use iso-2022 to write this file. No default use of GL and GR is allowed.
*/
load("oxrfc100.rr")$
module mathematica;
localf find_proc$
localf start_org$
localf start$
localf start_unix$
localf start_windows$
localf tree_to_string$
localf foo$
localf rtomstr$
localf complex$
localf n_Eigenvalues$
localf inverse$
localf teXForm$
extern Xm_noX $
extern Xm_unix $
extern Xm_use_timer_to_start_server $
static M_proc$
M_proc = -1$
#define ML_FIND_PROC(P) P = getopt(proc);\
if (type(P) == -1) {\
P = find_proc();\
}
def find_proc() {
if (M_proc == -1) {
A = ox_get_serverinfo();
/* Look for ox_math. Not yet written */
/* Start ox_math automatically if there is not ox_sm1 */
M_proc = start();
}
return(M_proc);
}
print("Module mathematica (to communicate with Mathematica) Version 19991113.")$
print(" mathematica.start, mathematica.tree_to_string, mathematica.n_Eigenvalues, ...")$
#define LIST 4
#define VECTOR 5
#define MATRIX 6
/*&jp
{\tt OpenXM\_HOME} $B$NCM$r8+$F(B {\tt ox\_math} $B$N>l=j$r@_Dj(B.
{\tt OpenXM\_HOME} $B$NCM$,$J$$>l9g$O(B {\tt /usr/local/OpenXM}
*/
/*&eg
Look up the value of
{\tt OpenXM\_HOME} and determine the place of {\tt ox\_math}.
If this environmental variable is not set, use the default directory
{\tt /usr/local/OpenXM}.
*/
static Ox_math_lib$
Ox_math_lib = ox_getenv("OpenXM_HOME")$
if (Ox_math_lib == 0) {
Ox_math_lib = "/usr/local/OpenXM/src/ox_math"$
} else {
Ox_math_lib = Ox_math_lib+"/src/ox_math"$
}
/*&jp
{\tt m\_start()} $B$O(B {\tt ox\_math} $B$r(B localhost $B$G5/F0$9$k$?$a$N4X?t(B.
{\tt Xm\_noX} $B$NCM$,(B 1 $B$@$H(B, X $BL5$7$G5/F0$9$k(B.
*/
def start_org() {
if (Xm_noX) {
P = ox_launch_nox(0,Ox_math_lib+"/ox_math");
}else{
P = ox_launch(0,Ox_math_lib+"/ox_math");
}
/* ox_check_errors(P); */
M_proc = P;
print("ox_math has started.");
print("ox_math: Portions copyright 2000 Wolfram Research, Inc. ");
print("See OpenXM/Copyright/Copyright.mathlink for details.");
return(P);
}
def start() {
print("Starting ox_math.");
print("ox_math: Portions copyright 2000 Wolfram Research, Inc. ");
print("See OpenXM/Copyright/Copyright.mathlink for details.");
if (ox_ostype()[0] == "windows" && Xm_unix == 0)
return start_windows(0);
else
return start_unix();
}
def start_unix() {
if (Xm_noX) {
P = ox_launch_nox(0,Ox_math_lib+"/ox_math");
}else{
P = ox_launch(0,Ox_math_lib+"/ox_math");
}
if (Xm_noX) {
sm1.sm1(P," oxNoX ");
}
/* ox_check_errors(P); */
M_proc = P;
return(P);
}
def start_windows(U) {
CPort = generate_port();
SPort = generate_port();
if (U) { /* Test on unix. */
Com = "ox -ox " + Ox_math_lib+"/ox_math " +
" -data "+ rtostr(SPort) +" -control "+ rtostr(CPort);
Com = "oxlog xterm -iconic -T ox_math -n ox_math -e "+ Com + "& ";
}else{
/* OpenXM_HOME_WIN="c:\\cygwin\\home\\nobuki\\OpenXM";
OpenXM_HOME_WIN2="/home/nobuki/OpenXM";
OpenXM_START_EXE = "c:/windows/command/start";
*/
OpenXM_HOME_WIN = ox_getenv("OpenXM_HOME_WIN");
OpenXM_START_EXE = ox_getenv("OpenXM_START_EXE");
Ox_math_lib = OpenXM_HOME_WIN;
Ox_sm1_forAsir = OpenXM_HOME_WIN+"\\bin\\ox_math.exe";
F = open_file(Ox_sm1_forAsir);
if (F < 0) {
error("ox_math.exe is not existing. Check your installation.");
return(-1);
}
close_file(F);
Com = OpenXM_HOME_WIN+"\\bin\\ox -ox " +
Ox_sm1_forAsir + " " +
" -data "+ rtostr(SPort) +" -control "+ rtostr(CPort);
Com = OpenXM_START_EXE+" /MIN "+Com ;
}
print(Com +"\n");
shell(Com);
if (Xm_use_timer_to_start_server) {
print("Waiting for 3 seconds."); sleep(3000);
}else{
purge_stdin(); print("Type in Return to connect to the server.");
get_line();
}
print("Trying to connect to the server...",0)$
CSocket = try_connect("localhost",CPort);
SSocket = try_connect("localhost",SPort);
P = register_server(CSocket,CPort,SSocket,SPort);
print(" Done.");
if (Xm_noX) {
sm1.sm1(P," oxNoX ");
}
/* ox_check_errors(P); */
M_proc = P;
return(P);
}
/*&jp
$B0J2<$G(BMathematica $B$r8F$V$?$a$NJd=u4X?t$rDj5A$9$k(B.
*/
/*&jp
{\tt m\_tree\_to\_string(L)} $B$O(B, {\tt MathLink} $B$N(B $BLZ7A<0$GM?$($l$?(B
$B%*%V%8%(%'%/%H$r$J$k$Y$/(B asir $B$,M}2r$G$-$k7A$G$N(B, $BA0CV$^$?$OCfCV5-K!(B
$B$NJ8;zNs$KJQ49$9$k(B. \\
$BNc(B: {\tt m\_tree\_to\_string(["Plus",1,2])} $B$OJ8;zNs(B
{\tt 1+2} $B$rLa$9(B. \\
$B%j%9%H$N@hF,$NJ8;zNs$,%-!<%o!<%I$G$"$k$,(B, $B$=$NJ8;z$,JQ49%F!<%V%k$K$J$$(B
$B$H$-$O(B, {\tt m\_} $B$r%-!<%o!<%I$N@hF,$K$D$1$F(B, $B4X?t8F=P7A<0$NJ8;zNs$X(B
$BJQ$($k(B.
*/
def tree_to_string(L) {
if (type(L) != LIST) {
return(rtostr(L));
}
N = length(L);
if (N == 0) return(" ");
Infix = 0; Prefix = 0;
if (L[0] == "Plus") {
Infix = "+";
}else if (L[0] == "Times") {
Infix = "*";
}else if (L[0] == "Power") {
Infix = "^";
}else if (L[0] == "Rational") {
Infix = "/";
}else if (L[0] == "List") {
Prefix = "List";
}else if (L[0] == "Square") {
Prefix = "sqrt";
}else if (L[0] == "Sin") {
Prefix = "sin";
}else if (L[0] == "Cos") {
Prefix = "cos";
}
if (type(Infix) != 0) {
Ans = "("+tree_to_string(L[1])+")";
for (I=2; I<N; I++) {
Ans = Ans+Infix+"("+tree_to_string(L[I])+")";
}
return(Ans);
}else if (type(Prefix) != 0) {
if (Prefix == "List") {
Ans = "[";
}else{
Ans = Prefix + "(";
}
for (I=1; I<N; I++) {
if (I == 1) {
Ans = Ans +tree_to_string(L[I]);
}else{
Ans = Ans +" , "+tree_to_string(L[I]);
}
}
if (Prefix == "List") {
return(Ans+"]");
}else{
return(Ans+")");
}
}else{
Ans = "m_"+rtostr(L[0])+"(";
for (I=1; I<N; I++) {
if (I == 1) {
Ans = Ans +tree_to_string(L[I]);
}else{
Ans = Ans +" , "+tree_to_string(L[I]);
}
}
return(Ans+")");
}
}
/* Use eval_str() (= ToExpression[] in Mathematica.) to
translate a string to an object in asir. */
def foo() {
print(tree_to_string(["Plus",1,x,["Times",2,x]]));
print(tree_to_string(["Plus",["Sin",2],x,["Times",2,x]]));
print(tree_to_string(ox_execute_string(0,"Factor[x^10-1]")));
}
/*&jp
$B4X?t(B \verb+ mathematica.rtomstr(L) + $B$O(B asir $B7A<0$N%*%V%8%'%/%H(B L $B$r$J$k$Y$/(B
Mathematica $B$,M}2r$G$-$k7A$NJ8;zNs$KJQ49$9$k(B.
$B$?$H$($P(B, $B%j%9%H(B, $B%Y%/%H%k(B, $B9TNs(B $B$O(B asir $B$G$O(B {\tt [}, {\tt ]}
$B$G0O$`$,(B, Mathematica $B$G$O(B, {\tt \{ }, {\tt \}} $B$G0O$`(B.
$B8=:_$N$H$3$m$3$N4X?t$O$3$NJQ49$N$_9T$J$C$F$$$k(B. \\
$BNc(B:
{\footnotesize
\begin{verbatim}
[262] mathematica.rtomstr([1,2,3]);
{1,2,3}
[375] A = newvect(3,[x+2,"Hello",[1/2,3]]);
[ x+2 Hello [1/2,3] ]
[376] mathematica.rtomstr(A);
{x+2,Hello,{1/2,3}}
\end{verbatim}
}
*/
def rtomstr(L) {
if (type(L) != LIST && type(L) != VECTOR && type(L) != MATRIX) {
return(rtostr(L));
}
if (type(L) == VECTOR) {
N = size(L)[0];
}else if (type(L) == MATRIX) {
N = size(L)[0];
}else{
N = length(L);
}
Ans ="{";
for (I=0; I<N; I++) {
if (I==0) {
Ans = Ans + rtomstr(L[I]);
}else{
Ans = Ans +","+rtomstr(L[I]);
}
}
Ans = Ans + "}";
return(Ans);
}
def complex(A,B) {
return(A+B*@i);
}
/*&jp
\verb n_Eigenvalues(M) + $B$O9TNs(B {\tt M} $B$N8GM-CM$N?tCM6a;w$r(B Mathematica
$B$rMxMQ$7$F5a$a$k4X?t$G$9(B.
*/
/*&eg
The function \verb n_Eigenvalues(M) + returns numerical approximations
of the eigenvalues of the matrix {\tt M} by calling Mathematica.
*/
/*&C
\begin{verbatim}
[360] mathematica.n_Eigenvalues([[1,2],[3,5]]);
[-0.162278,6.16228]
[466] mathematica.n_Eigenvalues([[0,1],[-1,0]]);
[(-1*@i),(1*@i)]
\end{verbatim}
*/
def n_Eigenvalues(M) {
ML_FIND_PROC(P) ;
A = rtomstr(M);
ox_execute_string(P,"N[Eigenvalues["+A+"]]");
B = ox_pop_cmo(B);
C = tree_to_string(B);
return(eval_str(C));
}
/*&jp
\verb mathematica.inverse(M) + $B$O9TNs(B {\tt M} $B$N5U9TNs$r(B Mathematica
$B$rMxMQ$7$F5a$a$k4X?t$G$9(B.
*/
/*&eg
The function \verb mathematica.inverse(M) + returns the inverse matrix of
{\tt M} by calling Mathematica.
*/
/*&C
\begin{verbatim}
[682] mathematica.inverse([[x,y],[x+2,x-1]]);
[[(x-1)/(x^2+(-y-1)*x-2*y),(-y)/(x^2+(-y-1)*x-2*y)],
[(-x-2)/(x^2+(-y-1)*x-2*y),(x)/(x^2+(-y-1)*x-2*y)]]
[683] mathematica.inverse([[1,2],[3,4]]);
[[-2,1],[3/2,-1/2]]
\end{verbatim}
*/
def inverse(M) {
ML_FIND_PROC(P) ;
A = rtomstr(M);
ox_execute_string(P,"Inverse["+A+"]");
B = ox_pop_cmo(B);
C = tree_to_string(B);
return(eval_str(C));
}
/*&jp
$B<!$N4X?t$O(B, random $B$K(B N X N $B<BBP>N9TNs$r(B S $B8DMp?t$rMQ$$$F@8@.$7$F(B ($M = M^T$),
$B3F!9$N8GM-CM$r(BMathematica $B$G7W;;$7$^$9(B.
$B:G8e$K:GBg8GM-CM$NJ,I[>u67$rEz$($^$9(B.
($B$?$H$($P(B, [-10,-9] $B$N4V$K(B 3 $B8D(B, [-9,-8] $B$N4V$K(B 14 $B8D(B, ....,
[9,10] $B$N4V$K(B 4 $B8D(B $B$J$I(B)
GNUPLOT $B$GJ,I[$N%R%9%H%0%i%`$b=q$-$^$9(B.
$B$3$NLdBj$r(B random matrix $B$N8GM-CMJ,I[$NLdBj$H$$$$(B,
Selberg $B@QJ,(B, $BD>8rB?9`<0(B, (Painleve $B4X?t(B?)$B$J$I$NLdBj$H4XO"$7$F$$$^$9(B.
*/
/* $B$^$@=q$$$F$J$$(B. */
def teXForm(M) {
ML_FIND_PROC(P) ;
A = rtomstr(M);
ox_execute_string(P,"ToString[TeXForm["+A+"]]");
B = ox_pop_cmo(P);
C = tree_to_string(B);
return C;
}
/* example:
teXForm("2/x");
example:
teXForm((x^2-1)/x);
*/
endmodule;
end$
/*&jp \end{document} */