changeset 5992:24d3e9a130b4

of-tisean: Fix for Octave 8 (bug #61583). * src/of-tisean-2-error_state.patch: Add patch to fix compilation with Octave 8. * dist-files.mk: Add new file to dist.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 29 Nov 2021 14:11:45 +0100
parents 94e6691fc42f
children bac4ef91ea7e
files dist-files.mk src/of-tisean-2-error_state.patch
diffstat 2 files changed, 638 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/dist-files.mk	Mon Nov 29 13:12:54 2021 +0100
+++ b/dist-files.mk	Mon Nov 29 14:11:45 2021 +0100
@@ -558,6 +558,7 @@
   of-struct.mk \
   of-symbolic.mk \
   of-tisean-1-fixes.patch \
+  of-tisean-2-error_state.patch \
   of-tisean.mk \
   of-tsa.mk \
   of-video-1-fixes.patch \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/of-tisean-2-error_state.patch	Mon Nov 29 14:11:45 2021 +0100
@@ -0,0 +1,637 @@
+# HG changeset patch
+# User Markus Mützel <markus.muetzel@gmx.de>
+# Date 1638190865 -3600
+#      Mon Nov 29 14:01:05 2021 +0100
+# Node ID fdca531d6a1268500b3ebefbacb97a4a44141c43
+# Parent  7d4b181cd726d9ad0d6ee5a37d128d90fc925858
+Remove usage of `error_state` (bug #61583).
+
+* src/pcregexp.cc (many files): Remove usage of `error_state`. It was
+unconditionally set to 0 since about 6 years ago and will finally be removed in
+Octave 8.
+
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__boxcount__.cc
+--- a/src/__boxcount__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__boxcount__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -194,8 +194,6 @@
+ 
+       octave_idx_type length=LENGTH-(maxembed-1)*DELAY;
+ 
+-      if ( ! error_state)
+-        {
+           // Calculate output
+           double heps              = EPSMAX*EPSFAKTOR;
+           octave_idx_type epsi_old = 0;
+@@ -276,7 +274,6 @@
+ 
+ 
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__c1__.cc
+--- a/src/__c1__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__c1__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -77,10 +77,6 @@
+       bool verbose           = args(9).bool_value ();
+       octave_idx_type iverb  = verbose;
+ 
+-
+-      if (! error_state)
+-        {
+-
+           octave_idx_type lines_read   = input.rows (); //nmax in d1()
+           octave_idx_type columns_read = input.columns ();
+ 
+@@ -136,7 +132,6 @@
+             }
+ 
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__d2__.cc
+--- a/src/__d2__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__d2__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -365,9 +365,6 @@
+       time_t lasttime;
+       time(&lasttime);
+ 
+-      if (! error_state)
+-        {
+-
+           bool imin_too_large = false;
+           bool pause_calc     = false;
+           // Calculate the outputs
+@@ -608,7 +605,6 @@
+           // Assign outputs
+           retval(0) = values;
+           retval(1) = vars;
+-        }
+ 
+     }
+   return retval;
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__delay__.cc
+--- a/src/__delay__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__delay__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -60,8 +60,6 @@
+ 
+       OCTAVE_LOCAL_BUFFER (octave_idx_type, inddelay, alldim);
+ 
+-      if (! error_state)
+-        {
+           octave_idx_type rundel=0;
+           octave_idx_type runmdel=0;
+ 
+@@ -108,7 +106,6 @@
+               // previously fprintf(stdout,"\n");
+             }
+           retval(0) = series;
+-        }
+ 
+     }
+   return retval;
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__false_nearest__.cc
+--- a/src/__false_nearest__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__false_nearest__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -179,8 +179,6 @@
+       check_alloc(vcomp=(unsigned int*)malloc(sizeof(int)*(maxdim)));
+       check_alloc(vemb=(unsigned int*)malloc(sizeof(int)*(maxdim)));
+ 
+-      if ( ! error_state)
+-        {
+           for (i=0;i<maxdim;i++) {
+             if (comp == 1) {
+               vcomp[i]=0;
+@@ -250,7 +248,6 @@
+ 
+           for (i = 0; i < 4; i++)
+             retval(i) = output.column(i);
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__ghkss__.cc
+--- a/src/__ghkss__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__ghkss__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -203,8 +203,6 @@
+ 
+   OCTAVE_LOCAL_BUFFER (double, hav, comp);
+   OCTAVE_LOCAL_BUFFER (double, hsigma, comp);
+-  if ( ! error_state)
+-    {
+       for (j=0;j<comp;j++)
+         hav[j]=hsigma[j]=0.0;
+ 
+@@ -238,7 +236,6 @@
+       }
+ 
+       resize_eps=0;
+-    }
+ }
+ 
+ DEFUN_DLD (__ghkss__, args, , HELPTEXT)
+@@ -338,9 +335,6 @@
+         mat[i]=(double*)(matarray+dim*i);
+       check_alloc(hser=(double**)malloc(sizeof(double*)*comp));
+ 
+-      if ( ! error_state)
+-        {
+-          // Create output matrix
+           Matrix output (length, comp);
+ 
+           for (i=0;i<dim;i++) {
+@@ -423,7 +417,7 @@
+                   }
+             }
+           retval(0) = output;
+-        }
++
+     // Deallocate of all the memory
+       delete[] d_min;
+       delete[] d_max;
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lfo_ar__.cc
+--- a/src/__lfo_ar__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lfo_ar__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -168,12 +168,6 @@
+     Matrix solved_vec = mat.solve(vec);
+     double *solved_vec_arr = solved_vec.fortran_vec ();
+ 
+-    // If errors were raised, there is no sense in countinueing
+-    if (error_state)
+-      {
+-        return ;
+-      }
+-
+     double cast=foreav[i];
+     for (octave_idx_type j=0;j<dim;j++) {
+ 
+@@ -262,9 +256,6 @@
+ 
+       octave_idx_type clength=(CLENGTH <= LENGTH) ? CLENGTH-STEP : LENGTH-STEP;
+ 
+-      if ( ! error_state)
+-        {
+-
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -313,11 +304,6 @@
+                       make_fit (series, found, error_array,
+                                 i,dim, embed, delay, STEP, actfound);
+                       // Checking if the fit was correct
+-                      // If any errors were raised: end function
+-                      if (error_state)
+-                        {
+-                          return retval;
+-                        }
+                       pfound++;
+                       avfound += (double)(actfound-1);
+                       for (octave_idx_type j=0;j<dim;j++) 
+@@ -365,7 +351,6 @@
+           output.resize (count, dim + 4);
+ 
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lfo_run__.cc
+--- a/src/__lfo_run__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lfo_run__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -226,13 +226,6 @@
+       Matrix solved_vec      = mat.solve (vec);
+       double *solved_vec_arr = solved_vec.fortran_vec ();
+ 
+-    // If errors were raised (a singular matrix was encountered), 
+-    // there is no sense in countinuing
+-    if (error_state)
+-      {
+-        return ;
+-      }
+-
+       newcast[i]=foreav[i];
+       for (octave_idx_type j=0;j<dim;j++) {
+         for (octave_idx_type j1=0;j1<embed;j1++) {
+@@ -330,9 +323,6 @@
+         for (octave_idx_type i=0;i<hdim;i++)
+           cast[i][j]=series[j][LENGTH-hdim+i];
+ 
+-      if ( ! error_state)
+-        {
+-
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -377,12 +367,6 @@
+                         make_zeroth(series, found, dim, actfound,newcast);
+ 
+                       // Checking if the fit was correct
+-                      // If any errors were raised: end function
+-                      if (error_state)
+-                        {
+-                          return retval;
+-                        }
+-
+                       for (octave_idx_type j=0;j<dim;j++)
+                         {
+                       // old printf("%e ",newcast[j]*interval[j]+min_array[j]);
+@@ -410,7 +394,6 @@
+                 }
+             }
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lfo_test__.cc
+--- a/src/__lfo_test__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lfo_test__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -212,13 +212,6 @@
+       Matrix solved_vec      = mat.solve (vec);
+       double *solved_vec_arr = solved_vec.fortran_vec ();
+ 
+-    // If errors were raised (a singular matrix was encountered), 
+-    // there is no sense in countinueing
+-    if (error_state)
+-      {
+-        return ;
+-      }
+-
+       newcast[i]=foreav[i];
+       for (octave_idx_type j=0;j<DIM;j++) {
+         octave_idx_type hcj=indexes[0][j];
+@@ -332,9 +325,6 @@
+       for (octave_idx_type i=0;i<COMP;i++)
+         error_array[i]=0.0;
+ 
+-      if ( ! error_state)
+-        {
+-
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -375,11 +365,6 @@
+                       make_fit(series, indexes, found, STEP, DIM, COMP,
+                                actfound,i,newcast);
+                       // Checking if the fit was correct
+-                      // If any errors were raised: end function
+-                      if (error_state)
+-                        {
+-                          return retval;
+-                        }
+                       for (octave_idx_type j=0;j<COMP;j++)
+                         error_array[j] += sqr(newcast[j]-series[j][i+STEP]);
+ 
+@@ -415,7 +400,6 @@
+ 
+           retval(0) = rel;
+           retval(1) = ind;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lyap_k__.cc
+--- a/src/__lyap_k__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lyap_k__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -211,8 +211,6 @@
+         eps_fak=pow(epsmax/epsmin,1.0/(double)(epscount-1));
+ 
+ 
+-      if (! error_state)
+-        {
+           // Calculate exponents
+           dim_vector dv (epscount ,((int)maxdim-(int)mindim + 1));
+           string_vector keys;
+@@ -274,7 +272,6 @@
+             }
+           // Assign output
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lyap_r__.cc
+--- a/src/__lyap_r__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lyap_r__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -167,9 +167,6 @@
+       octave_idx_type maxlength=length-delay*(dim-1)-steps-1-mindist;
+       bool alldone=0;
+ 
+-      if (! error_state)
+-        {
+-
+           // Calculate the maximum epsilon that makes sense
+           // On the basis of 'i' and 'j' from put_in_boxes ()
+           NDArray input_max = input.max ();
+@@ -224,7 +221,6 @@
+ 
+           // Assign output
+           retval(0) = output;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lyap_spec__.cc
+--- a/src/__lyap_spec__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lyap_spec__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -220,13 +220,6 @@
+       Matrix solved      = mat.solve (vec);
+       double *solved_arr = solved.fortran_vec ();
+ 
+-    // If errors were raised (a singular matrix was encountered), 
+-    // there is no sense in countinuing
+-    if (error_state)
+-      {
+-        return ;
+-      }
+-
+       double new_vec = solved_arr[0];
+       for (octave_idx_type i=1;i<=alldim;i++)
+         dynamics[d][i-1] = solved_arr[i];
+@@ -419,9 +412,6 @@
+         }
+      // end old indexes = make_multi_index();
+ 
+-      if (!error_state)
+-        {
+-
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -463,13 +453,7 @@
+               make_dynamics(series, box, indexes, epsmin, epsset, EPSSTEP,
+                             EMBED, MINNEIGHBORS, LENGTH, DIMENSION, count,
+                             avneig, aveps, dynamics, averr, i);
+-              // If there was an error
+-              // (matrix singularity or not enough neighbors)
+-              // No sense continuing
+-              if (error_state)
+-                {
+-                  return retval;
+-                }
++
+               make_iteration(DIMENSION, alldim, dynamics, delta);
+               gram_schmidt(alldim, delta,lfactor);
+               for (octave_idx_type j=0;j<alldim;j++) {
+@@ -562,7 +546,6 @@
+               retval(0) = lyap_exp;
+               retval(1) = pars;
+             }
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lzo_gm__.cc
+--- a/src/__lzo_gm__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lzo_gm__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -110,8 +110,6 @@
+ 
+       MArray<octave_idx_type> box (dim_vector(NMAX,NMAX));
+ 
+-      if ( ! error_state)
+-        {
+           // Estimate maximum possible output size
+           octave_idx_type output_rows = (octave_idx_type)
+                                         ((log(EPS1) - log(EPS0)) / log (EPSF));
+@@ -194,8 +192,6 @@
+           output.resize (count, dim + 4);
+ 
+           retval(0) = output;
+-
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lzo_run__.cc
+--- a/src/__lzo_run__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lzo_run__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -209,8 +209,6 @@
+ 
+       MArray<octave_idx_type> box (dim_vector(NMAX,NMAX));
+ 
+-      if ( ! error_state)
+-        {
+           for (octave_idx_type j=0;j<dim;j++)
+             for (octave_idx_type i=0;i<hdim;i++)
+               cast[i][j]=input(LENGTH-hdim+i,j);
+@@ -292,7 +290,6 @@
+             }
+           else 
+             retval(0) = Matrix (0,0);
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__lzo_test__.cc
+--- a/src/__lzo_test__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__lzo_test__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -150,8 +150,6 @@
+       MArray<octave_idx_type> box (dim_vector(NMAX, NMAX));
+ 
+       // Compute forecast error
+-      if ( ! error_state)
+-        {
+           for (octave_idx_type i=0;i<LENGTH;i++)
+             done[i]=0;
+ 
+@@ -236,7 +234,6 @@
+ 
+           retval(0) = rel_forecast_err;
+           retval(1) = ind_forecast_err;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__poincare__.cc
+--- a/src/__poincare__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__poincare__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -129,8 +129,6 @@
+ 
+ 
+ 
+-        if ( ! error_state)
+-          {
+             Matrix output (out_size, embdim);
+ 
+             octave_idx_type count = poincare (input.fortran_vec(), 
+@@ -141,7 +139,6 @@
+             output.resize (count, embdim);
+ 
+             retval(0) = output;
+-          }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__polynom__.cc
+--- a/src/__polynom__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__polynom__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -222,8 +222,6 @@
+       make_coding(coding_vec,N,N,DIM-1,1,0);
+       octave_idx_type *coding = coding_vec.data();
+ 
+-      if (! error_state)
+-        {
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -232,12 +230,6 @@
+           make_fit (series, coding, results, INSAMPLE, N, DIM, DELAY,
+                     maxencode, pars);
+ 
+-          // If error encountered during the fit there is no sense to continue
+-          if (error_state)
+-            {
+-              return retval;
+-            }
+-
+           // Create outputs
+ 
+           // Create output that contains the number of free parameters
+@@ -303,7 +295,6 @@
+           retval(2) = coeffs;
+           retval(3) = sample_err;
+           retval(4) = forecast;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__rbf__.cc
+--- a/src/__rbf__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__rbf__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -152,9 +152,6 @@
+         for (octave_idx_type j=0;j<DIM;j++)
+           center[i][j]=series[(DIM-1)*DELAY-j*DELAY+(i*cstep)/(CENTER-1)];
+ 
+-      if (! error_state)
+-        {
+-
+           // Promote warnings connected with singular matrixes to errors
+           set_warning_state ("Octave:nearly-singular-matrix","error");
+           set_warning_state ("Octave:singular-matrix","error");
+@@ -207,10 +204,6 @@
+           coefs = mat.solve(coefs);
+           coefs_arr = coefs.fortran_vec ();// coefs takes up new memory space
+ 
+-          // If solving the matrix generated errors do not continue
+-          if (error_state)
+-            return retval;
+-
+           // end make_fit()
+ 
+ 
+@@ -314,7 +307,6 @@
+           retval(2) = coeff; 
+           retval(3) = sample_error; // sample error [in sample; out of sample];
+           retval(4) = forecast; // forecast values;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__surrogates__.cc
+--- a/src/__surrogates__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__surrogates__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -63,9 +63,6 @@
+       octave_idx_type ispec = args(3).idx_type_value ();
+       double seed           = args(4).double_value ();
+ 
+-      if (! error_state)
+-        {
+-
+           octave_idx_type nmaxp = input.rows ();
+           octave_idx_type mcmax = input.columns ();
+ 
+@@ -90,8 +87,6 @@
+ 
+           retval(0) = surro_data;
+           retval(1) = pars;
+-        }
+-
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__upo__.cc
+--- a/src/__upo__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__upo__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -74,10 +74,6 @@
+       int icen        = args(9).int_value();
+ 
+ 
+-
+-      if (! error_state)
+-        {
+-
+           int lines_read = in_out1.numel();
+           // Generating output vectors with estimated lengths
+           // The extra length (+1) is to store the actual lengths
+@@ -98,7 +94,6 @@
+           retval(1) = orbit_data;
+           retval(2) = acc;
+           retval(3) = stability;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/__xzero__.cc
+--- a/src/__xzero__.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/__xzero__.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -111,8 +111,6 @@
+       double epsilon=EPS0/EPSF;
+       octave_idx_type clength=(CLENGTH <= LENGTH) ? CLENGTH-STEP : LENGTH-STEP;
+ 
+-      if (! error_state)
+-        {
+           // Calculate fit
+           while (!alldone) {
+             alldone=1;
+@@ -142,8 +140,6 @@
+               output(i,0) = sqrt(error_array[i]/(clength-(DIM-1)*DELAY))/rms2;
+             }
+           retval(0) = output;
+-        }
+-
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/lazy.cc
+--- a/src/lazy.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/lazy.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -133,8 +133,6 @@
+                        "Number of iterations (IMAX) must be a positive "
+                        "integer");
+ 
+-      if (! error_state)
+-        {
+         // If vector is in 1 row: transpose (we will transpose the output to fit)
+             transposed = 0;
+ 
+@@ -160,7 +158,6 @@
+ 
+           retval(0) = in_out1;
+           retval(1) = in_out2;
+-        }
+     }
+   return retval;
+ }
+diff -r 7d4b181cd726 -r fdca531d6a12 src/mutual.cc
+--- a/src/mutual.cc	Mon Nov 29 13:49:05 2021 +0100
++++ b/src/mutual.cc	Mon Nov 29 14:01:05 2021 +0100
+@@ -193,8 +193,6 @@
+       int32NDArray h2 (dim_vector(partitions, partitions));
+       OCTAVE_LOCAL_BUFFER (long, array, length);
+ 
+-      if (! error_state)
+-        {
+           // Load array
+ 
+           // Rescale data and load array
+@@ -246,7 +244,6 @@
+             }
+           retval(0) = delay;
+           retval(1) = mutual_inf;
+-        }
+     }
+   return retval;
+ }