[BACK]Return to mathematica.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

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} */