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

File: [local] / OpenXM / src / asir-contrib / packages / src / python.rr (download)

Revision 1.3, Sun Jan 2 02:54:00 2022 UTC (2 years, 5 months ago) by takayama
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +39 -2 lines

Bug of a big string.  python.execute_by_file(Cmd1,Cmd_to_get_a_value)
Example: python.execute_by_file(["import numpy as np","A=[[1,1],[2,3]]"],"np.linalg.matrix_rank(A)");

/*$OpenXM: OpenXM/src/asir-contrib/packages/src/python.rr,v 1.3 2022/01/02 02:54:00 takayama Exp $*/

module python;

/* ------------ list of local functions ---------- */
localf init_python_proc$
localf which_ox_python$
localf get_python_proc$
localf set_python_proc$
localf find_proc$
localf start$
localf start_unix$
localf start_windows$
localf stop$
localf set_debug$
localf execute_by_file$

localf rat_to_float$
localf array$
localf matrix_rank$
localf solve_by_QR$
localf test1$
localf test2$
/*  ------------ static variables ---------------- */
static PYTHON_proc$
static Debug$

/*
#define CHECK_ERROR(ans) ((type(ans)==4)&&(length(ans)>0)&&(ans[0]=="Error")?return(ans);:ans)
*/

def init_python_proc() {
  PYTHON_proc = -1;
  Debug=0;
}

def set_debug(L) {
  Debug=L;
}
/* Functions to get and set static variables out of the module */
def get_python_proc() {
  return PYTHON_proc;
}

def set_python_proc(A) {
  PYTHON_proc = A;
}

#define    PYTHON_FIND_PROC(P)  P = getopt(proc);\
                          if (type(P) == -1) {\
                             P = find_proc();\
                          }

def which_ox_python() {
  L = ox_get_serverinfo();
  for (I=0; I<length(L); I++) {  
    if (base_position("ox_python",L[I][1][0])>0) return L[I][0];
  }
  return -1;
}

def find_proc() {
  /*! extern PYTHON_proc; */
  if (PYTHON_proc == -1) {
     PYTHON_proc = which_ox_python();
     if (PYTHON_proc < 0) PYTHON_proc = start();
  }
  return(PYTHON_proc);
}

def stop() {
  if (PYTHON_proc >= 0) {
    ox_shutdown(PYTHON_proc);
    PYTHON_proc=-1;
  }
}
/* Search : oxPrintMessage, see cmoDebugCMO, too. */
/************** end of configure *******************************/

def start() {
  extern Xm_unix;
  if (ox_ostype()[0] == "windows" && Xm_unix == 0)
    return start_windows(0);
  else
    return start_unix();
}

def start_unix() {
 extern Xm_noX;
 if (Xm_noX) {
   P = ox_launch_nox(0,getenv("OpenXM_HOME")+"/src/ox_python/ox_python");
 }else{
   P = ox_launch(0,getenv("OpenXM_HOME")+"/src/ox_python/ox_python");
 }
// ox_check_errors(P);  //workaround to avoid mathcap error.
 PYTHON_proc = P;
 return(P);
}

def start_windows(U) {
  error("Not implemeted.");
}

def rat_to_float(Obj) {
  if (type(Obj)<4) return(number_eval(Obj));
  if (type(Obj)==4) return map(rat_to_float,Obj);
  if ((type(Obj)==5) || (type(Obj)==6)) return map(number_eval,Obj);
  if (type(Obj)==7) return Obj;
  error("rat_to_float does not support this object.");
}
def array(Obj) { return Obj; }  /* for python tag array */

def matrix_rank(Mat) {
  PYTHON_FIND_PROC(Pid);
  Mat=matrix_matrix_to_list(Mat);
  Mat=rat_to_float(Mat);

  Cmd=sprintf("import numpy as np\n"); 
  if (Debug) printf("Cmd=%a",Cmd);
  ox_execute_string(Pid,Cmd);
  Cmd=sprintf("ox_a=np.array(%a)\n",Mat); 
  if (Debug) printf("Cmd=%a",Cmd);
  ox_execute_string(Pid,Cmd);
  /*** printf("strlen(cmd)=%a\n",length(strtoascii(Cmd))); ***/
  ox_cmo_rpc(Pid,"PyRun_String","str(np.linalg.matrix_rank(ox_a))");
  Ans=ox_pop_cmo(Pid);
  Ans=eval_str(rtostr(Ans));
  return Ans;
}
def test1() {
  matrix_rank([[1,2],[3,4],[(2^5-1)/3^8,10.5]]);
}

def solve_by_QR(A,B) {
  PYTHON_FIND_PROC(Pid);
  A=rat_to_float(matrix_matrix_to_list(A)); 
  B=rat_to_float(matrix_matrix_to_list(B)); 
  Cmd=sprintf("import numpy as np; ox_a=np.array(%a); ox_b=np.array(%a)\n",A,B); 
  if (Debug) printf("Cmd=%a",Cmd);
  ox_execute_string(Pid,Cmd);

  Cmd=sprintf("ox_q,ox_r=np.linalg.qr(ox_a);\n");
  if (Debug) printf("Cmd=%a",Cmd);
  ox_execute_string(Pid,Cmd);

  Cmd=sprintf("ox_qb=np.dot(ox_q.T,ox_b);\n");
  if (Debug) printf("Cmd=%a",Cmd);
  ox_execute_string(Pid,Cmd);
  
  ox_cmo_rpc(Pid,"PyRun_String","str(repr(np.linalg.solve(ox_r,ox_qb)))");
  Ans=ox_pop_cmo(Pid);
  if (Debug) printf("Ans=%a\n",Ans);
  Ans=eval_str("python."+Ans);

  /* Check the result */
  Err=matrix_list_to_matrix(A)*matrix_list_to_matrix(Ans)-matrix_list_to_matrix(B);
  ErrMax=0;
  for (I=0; I<length(Err); I++) {
    if ((Tmax=number_abs(Err[I])) > ErrMax) ErrMax=Tmax;
  }
  return [Ans,ErrMax];
}

def test2() {
  print(solve_by_QR([[1,2],[3,4],[1/2,6]],[2,3,5]));
  solve_by_QR([[1,2],[3,4],[4,6]],[2,3,5]);
}

def execute_by_file(Cmd1,Cmd2) {
   OpenXM_tmp=getenv("OpenXM_tmp");
   if (OpenXM_tmp == 0) OpenXM_tmp=".";
   Cmd=sprintf("import os\n");
   Fname=sprintf("%a/tmp_python_%a.py",OpenXM_tmp,getpid());
   OutName=sprintf("%a/tmp_python_%a.txt",OpenXM_tmp,getpid());
   Cmd +=sprintf("oxp_f=open('%a',mode='w')\n",OutName);

   CmdAll="";
   if (type(Cmd1)==4) {
     for (I=0; I<length(Cmd1); I++) CmdAll += sprintf("%a\n",Cmd1[I]);
   }else CmdAll=Cmd1;

   Cmd += CmdAll;
   Cmd += sprintf("oxp_f.write(str(%a))\n",Cmd2);
   Cmd+="oxp_f.close()\n";
   print(Cmd);
   util_write_string_to_a_file(Fname,Cmd);
   shell(sprintf("python %a",Fname));

   Ans=util_read_file_as_a_string(OutName);
   if (type(getopt(del))>0) shell(sprintf("rm -f %a %a",Fname,OutName));
   return(Ans);
}
/*&usage
Cmd2 is the command that you want the result. The result is a string.
Example:
  execute_by_file("import numpy as np\nA=[[1,1],[2,3]]\n","np.linalg.matrix_rank(A)");
  execute_by_file(["import numpy as np","A=[[1,1],[2,3]]"],"np.linalg.matrix_rank(A)");
*/

endmodule;

python.init_python_proc()$
/* python.test2(); */

end$