new version of tcoffee 8.99 not yet compiled for ia32 linux (currently compiled for...
[jabaws.git] / binaries / src / tcoffee / t_coffee_source / util_job_handling.c
diff --git a/binaries/src/tcoffee/t_coffee_source/util_job_handling.c b/binaries/src/tcoffee/t_coffee_source/util_job_handling.c
new file mode 100644 (file)
index 0000000..838d911
--- /dev/null
@@ -0,0 +1,362 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "io_lib_header.h"
+#include "util_lib_header.h"
+#include "define_header.h"
+#include "dp_lib_header.h"
+
+
+
+Job_TC* print_lib_job ( Job_TC *job,char *string, ...)
+{
+  va_list ap;
+  char **list;
+  char **value;
+  char **name;
+  int a, np, n;
+    
+  char bname[100];
+  char bval[100];
+  
+  list=string2list2(string, " =");
+  n=atoi (list[0]);
+  
+
+  name =vcalloc ( (n-1)/2, sizeof (char*));
+  value=vcalloc ( (n-1)/2, sizeof (char*));
+  
+  
+  va_start (ap, string);
+  for (a=1, np=0; a<n; a++)
+    {
+      if (list[a][0]=='%' && list[a][1]=='s')
+       {
+         value[np++]=duplicate_string (va_arg (ap,char *));
+       }
+      else if (list[a][0]=='%')
+       {
+         if ( list[a][1]=='d')sprintf (bval, "%d", va_arg (ap,int));
+         else if ( list[a][1]=='f')sprintf (bval, "%lf",(float) va_arg (ap,double));
+         else if ( list[a][1]=='p')sprintf (bval, "%ld", (long)va_arg (ap,void *));
+         value[np++]=duplicate_string (bval);
+       }
+      else
+       {
+         sprintf (bname, "%s", list[a]);
+         name[np]=duplicate_string (bname);
+       }
+    }
+  free_arrayN((void**)list, 2);
+  
+  va_end (ap);
+  
+  return print_lib_job2 ( job,np,name,value);
+}
+
+static int njobs;
+Job_TC *print_lib_job2 ( Job_TC* job, int n, char **name, char **value)
+{
+  int a;
+  
+  if ( job==NULL)
+    {
+      job=vcalloc ( 1, sizeof (Job_TC));
+      job->pl=vcalloc (100, sizeof (char*));job->pl[job->np++]=(void*)job->pl;
+      job->jobid=njobs++;
+    }
+  
+  for ( a=0; a< n; a++)
+    {
+      int string=0;
+      if ( strstr(name[a], "control") && !job->control){job->control=vcalloc ( 1, sizeof (Job_control_TC));job->pl[job->np++]=(void*)job->control;}
+      else if ( strstr(name[a], "io") && !job->io){job->io=vcalloc ( 1, sizeof (Job_io_TC));job->pl[job->np++]=(void*)job->io;}
+      else if ( strstr(name[a], "param") && !job->param){job->param=vcalloc ( 1, sizeof (Job_param_TC));job->pl[job->np++]=(void*)job->param;}
+      
+      if (           strm (name[a], "control"))                {job->control=(struct Job_control_TC*)atol(value[a]);string=0;}
+      else if (      strm (name[a], "control->submitF"))       {(job->control) ->submitF=(struct Job_TC *(*)(struct Job_TC *))atol(value[a]);string=0;}
+      else if (      strm (name[a], "control->retrieveF"))     {(job->control) ->retrieveF=(struct Job_TC *(*)(struct Job_TC *))atol(value[a]);string=0;}
+      else if (      strm (name[a], "control->mode"))   {(job->control)->mode=value[a];string=1;}
+      
+      else if ( strm (name[a], "param"))            {job->param=(struct Job_param_TC*)atol(value[a]);string=0;}
+      else if ( strm (name[a], "param->method"))    {job->pl[job->np++]=((job->param)->method)=value[a];string=1;}
+      else if ( strm (name[a], "param->TCM"))       {(job->param)->TCM= (TC_method *) atol(value[a]) ;string=0;}
+      else if ( strm (name[a], "param->aln_c"))     {job->pl[job->np++]=(job->param)->aln_c=value[a] ;string=1;}
+      else if ( strm (name[a], "param->seq_c"))     {job->pl[job->np++]=(job->param)->seq_c=value[a] ;string=1;}
+                          
+      
+      else if (           strm (name[a], "io"))                {job->io=(struct Job_io_TC*)atol(value[a]);string=0;}
+      else if ( strm (name[a], "io->out")) {job->pl[job->np++]=(job->io)->out=value[a] ;string=1;}
+      else if ( strm (name[a], "io->in" )) {job->pl[job->np++]=(job->io)->in =value[a] ;string=1;}
+      else if ( strm (name[a], "io->CL"))  {(job->io)->CL=(Constraint_list*)atol (value[a]); string=0;}
+      else
+       {
+         fprintf ( stderr, "ERROR: print_lib_job2: %s is unknown [FATAL:%s]", name[a], PROGRAM);
+         myexit (EXIT_FAILURE);
+       }
+      if ( string==0) vfree ( value[a]);
+    }
+  vfree ( value);
+  free_arrayN ((void **)name, 2);
+  return job;
+}
+
+
+
+/*Stack Manipulation*/
+Job_TC *queue_cat  (Job_TC *P, Job_TC *C)
+{
+  if ( !P && !C) return NULL;
+  else if (!P || P->jobid==-1)
+    {
+      vfree (P);
+      C->p=NULL;
+      return C;
+    }
+  else
+    {
+      P->c=C;
+      if (C)C->p=P;
+      return queue2last(P);
+    }
+  return NULL;
+}
+Job_TC *free_queue  (Job_TC *job)
+{
+  return NULL;
+  if (!job) return job;
+  else
+    {
+      job=queue2last(job);
+      while ( job)
+       {
+         job=free_job (job);
+       }
+      return job;
+    }
+}
+Job_TC *free_job  (Job_TC *job)
+  {
+    int a;
+    Job_TC *p;
+    
+    if ( !job ) return job;
+    else
+      {
+       for ( a=job->np-1; a>=0; a--)
+         vfree ( job->pl[a]);
+       p=job->p;
+       job->p=job->c=NULL;
+       vfree (job);
+       return p;
+      }
+    return NULL;
+  }
+Job_TC * queue2heap (Job_TC*job)
+{
+
+  while (job && job->p)
+    job=job->p;
+  return job;
+}
+Job_TC * queue2last (Job_TC*job)
+{
+
+  while (job && job->c)
+    {
+      job=job->c;
+    }
+  return job;
+}
+
+int queue2n (Job_TC*job)
+{
+  int n=0;
+
+
+  job=queue2last (job);
+  while (job && job->p)
+    {
+      n++;
+      job=job->p;
+
+    }
+  return n;
+}
+
+Job_TC * descend_queue (Job_TC*job)
+{
+
+  if (!job ||!job->c)return job;
+  else
+    {
+      (job->c)->p=job;
+      job=job->c;
+    }
+  return job;
+}
+
+Job_TC* delete_job (Job_TC *job)
+{
+  Job_TC *p, *c;
+  
+  p=job->p;
+  c=job->c;
+  free_job (job);
+  
+  return queue_cat (p, c);
+}
+
+Job_TC*** split_job_list (Job_TC *job, int ns)
+{
+  int a,u,n,nj,split;
+  Job_TC*** jl;
+  Job_TC *ljob;
+  //retun a pointer to ns splits for joblist
+  
+  
+  if (ns==0)return NULL;
+  job=queue2heap(job);
+  jl=vcalloc(ns+1, sizeof (Job_TC**));
+  jl[0]=vcalloc (2, sizeof (Job_TC*));
+  
+  nj=queue2n(job);
+  if   (nj==0)return NULL;
+  else split=(nj/ns)+1;
+   
+  n=a=u=0;
+  jl[a][0]=job;
+  while (job)
+    {
+      ljob=job;
+      if (n==split && a<ns)
+       {
+         jl[a][1]=job;
+         if (a<ns-1)
+           {
+             jl[a+1]=vcalloc (2, sizeof (Job_TC*));
+             jl[a+1][0]=job;
+             u++;
+           }
+         a++;
+         n=0;
+       }
+      n++;
+      job=job->c;
+    }
+
+  /*Display job details when debugging
+  a=0;
+  while (jl[a])
+    {
+      Job_TC *start,* end;
+      int todo=0;
+      
+      start=job=jl[a][0];
+      end=jl[a][1];
+      while (job!=end){todo++;job=job->c;}
+      job=start;
+      while (job!=end)
+       {
+         HERE ("--- %d %d %s",a, job, job->param->aln_c);
+         job=job->c;
+       }
+      a++;
+    }
+  
+    a=0;
+    while (jl[a]){HERE ("**** %d %d ", jl [a][0], jl[a][1]);a++;}
+    myexit (0);
+  */
+  return jl;
+}
+
+
+
+  
+/*Job Control*/
+Job_TC* submit_job ( Job_TC *job)
+{
+  
+  if (!(job->control)->mode ||!(job->control)->mode[0] || 1==1)
+    {
+      return (job->control)->submitF (job);
+    }
+  else
+    {
+      fprintf ( stderr, "\n%s is an unkown mode for posting jobs [FATAL:%s]",(job->control)->mode, PROGRAM);
+      myexit (EXIT_FAILURE);
+      return NULL;
+    }
+  
+}
+
+Job_TC* retrieve_job ( Job_TC *job)
+{
+  if (!(job->control)->mode ||!(job->control)->mode[0] || 1==1)
+    {
+      return (job->control)->retrieveF (job);
+    }
+  else
+    {
+      fprintf ( stderr, "\n%s is an unkown mode for posting jobs [FATAL:%s]",(job->control)->mode, PROGRAM);
+      myexit (EXIT_FAILURE);
+      return NULL;
+    }
+}
+int **n2splits (int splits, int tot)
+{
+  int **l;
+  int a,b,delta;
+  
+  if (splits==0)return NULL;
+  else if ( tot==0)return NULL;
+  else
+    {
+      
+      l=declare_int (splits,2);
+      delta=tot/splits;
+      
+      for (a=0,b=0; a<splits && b<tot; a++,b+=delta)
+       {
+         l[a][0]=b;
+         l[a][1]=MIN((b+delta),tot);
+       }
+      l[splits-1][1]=MAX((l[splits-1][1]),tot);
+      return l;
+    }
+}
+  
+/******************************COPYRIGHT NOTICE*******************************/
+/*© Centro de Regulacio Genomica */
+/*and */
+/*Cedric Notredame */
+/*Fri Feb 18 08:27:45 CET 2011 - Revision 596. */
+/*All rights reserved.*/
+/*This file is part of T-COFFEE.*/
+/**/
+/*    T-COFFEE is free software; you can redistribute it and/or modify*/
+/*    it under the terms of the GNU General Public License as published by*/
+/*    the Free Software Foundation; either version 2 of the License, or*/
+/*    (at your option) any later version.*/
+/**/
+/*    T-COFFEE is distributed in the hope that it will be useful,*/
+/*    but WITHOUT ANY WARRANTY; without even the implied warranty of*/
+/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the*/
+/*    GNU General Public License for more details.*/
+/**/
+/*    You should have received a copy of the GNU General Public License*/
+/*    along with Foobar; if not, write to the Free Software*/
+/*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/
+/*...............................................                                                                                      |*/
+/*  If you need some more information*/
+/*  cedric.notredame@europe.com*/
+/*...............................................                                                                                                                                     |*/
+/**/
+/**/
+/*     */
+/******************************COPYRIGHT NOTICE*******************************/