/* 
 * Javlov - a Java toolkit for reinforcement learning with multi-agent support. 
 *  
 * Copyright (c) 2009 Matthijs Snel 
 *  
 * This program 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 3 of the License, or 
 * (at your option) any later version. 
 * 
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. 
 */ 
//package net.javlov.util; 
 
public class ArrayUtil { 
   
  public static String arrayToString( double[] d) { 
    String s = ""; 
    for ( int i = 0; i < d.length; i++ ) 
      s += d[i] + " "; 
    return s; 
  } 
   
  public static String arrayToString( double[][] A, int opt) { 
    String s = ""; 
    int m = A.length; 
    if ( opt == 1 ) 
      for ( int i = 0; i < m; i++ ) { 
        try { 
          for ( int j = 0; j < A[i].length; j++ ) 
            if (j == (A[i].length-1)) 
              s += A[i][j] + "\n"; 
            else 
              s += A[i][j] + " "; 
        } catch (NullPointerException e) { 
          System.err.println("NULLPOINTER EXCEPT AT i=" + i); 
        } 
      } 
    else if ( opt == 2 ) 
      for ( int j = 0; j < A[0].length; j++ ) 
        for ( int i = 0; i < m; i++ ) 
          if (i == (m-1)) 
            s += A[i][j] + "\n"; 
          else 
            s += A[i][j] + " "; 
    return s; 
  } 
   
  public static String arrayToString( int[] d) { 
    String s = ""; 
    for ( int i = 0; i < d.length; i++ ) 
      s += d[i] + " "; 
    return s; 
  } 
   
  public static String arrayToString( int[][] A, int opt) { 
    String s = ""; 
    int m = A.length; 
    int n = A[0].length; 
    if ( opt == 1 ) 
      for ( int i = 0; i < m; i++ ) 
        for ( int j = 0; j < n; j++ ) 
          if (j == (n-1)) 
            s += A[i][j] + "\n"; 
          else 
            s += A[i][j] + " "; 
    else if ( opt == 2 ) 
      for ( int j = 0; j < n; j++ ) 
        for ( int i = 0; i < m; i++ ) 
          if (i == (m-1)) 
            s += A[i][j] + "\n"; 
          else 
            s += A[i][j] + " ";   
    return s; 
  } 
   
  public static String arrayToString( Object[] o) { 
    String s = ""; 
    for ( int i = 0; i < o.length; i++ ) 
      s += o[i] + " "; 
    return s; 
  } 
   
  public static int binaryToInt( int bin[] ) { 
    int r = 0, pos = 0; 
    for ( int i = bin.length - 1; i >= 0; i--) 
      r += bin[i]*Math.pow(2,pos++); 
    return r; 
  } 
   
  public double[] concat( double a[], double b[] ) { 
    double r[] = new double[a.length + b.length]; 
    System.arraycopy(a, 0, r, 0, a.length); 
    System.arraycopy(b, 0, r, a.length, b.length); 
    return r; 
  } 
   
  public static double[] diff( double[] a, double[] b) { 
    double r[] = new double[a.length]; 
    for ( int i = 0; i < a.length; i++ ) 
      r[i] = a[i] - b[i]; 
    return r;     
  } 
   
  public static double[] div ( int[] a, double d ) { 
    double r[] = new double[a.length]; 
    for ( int i = 0; i < a.length; i++ ) 
      r[i] = a[i] / d; 
    return r;     
  } 
   
  public static double[] div ( double[] a, int d ) { 
    double r[] = new double[a.length]; 
    for ( int i = 0; i < a.length; i++ ) 
      r[i] = a[i] / d; 
    return r;     
  } 
   
  public static double max( double[] d ) { 
    double max = Double.NEGATIVE_INFINITY; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] > max ) 
        max = d[i]; 
    return max; 
  } 
   
  public static int max( int[] d ) { 
    int max = Integer.MIN_VALUE; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] > max ) 
        max = d[i]; 
    return max; 
  } 
   
  public static int maxIndex( double[] d ) { 
    int maxpos = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] >= d[maxpos] ) 
        maxpos = i; 
    return maxpos; 
  } 
   
  public static int maxIndex( int[] d ) { 
    int maxpos = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] >= d[maxpos] ) 
        maxpos = i; 
    return maxpos; 
  } 
   
  public static int[] multimaxIndex( double[] d ) { 
    int maxpos[] = new int[d.length], 
      lastpos = 0; 
    double maxval = Double.NEGATIVE_INFINITY; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] > maxval ) { 
        maxval = d[i]; 
        maxpos = new int[d.length - i]; 
        lastpos = 0; 
        maxpos[lastpos++] = i; 
      } else if ( d[i] == maxval ) { 
        maxpos[lastpos++] = i; 
      } 
    int r[] = new int[lastpos]; 
    System.arraycopy(maxpos, 0, r, 0, lastpos); 
    return r; 
  } 
   
  public static int[] multimaxIndex( int[] d ) { 
    int maxpos[] = new int[d.length], 
      lastpos = 0, 
      maxval = Integer.MIN_VALUE; 
    for ( int i = 0; i < d.length; i++ ) 
      if ( d[i] > maxval ) { 
        maxval = d[i]; 
        maxpos = new int[d.length - i]; 
        lastpos = 0; 
        maxpos[lastpos++] = i; 
      } else if ( d[i] == maxval ) { 
        maxpos[lastpos++] = i; 
      } 
    int r[] = new int[lastpos]; 
    System.arraycopy(maxpos, 0, r, 0, lastpos); 
    return r; 
  } 
   
  public static double[] subArray( double a[], int start, int len ) { 
    double r[] = new double[len]; 
    System.arraycopy(a, start, r, 0, len); 
    return r; 
  } 
   
  public static int[] subArray( int a[], int start, int len ) { 
    int r[] = new int[len]; 
    System.arraycopy(a, start, r, 0, len); 
    return r; 
  } 
   
  public static int[] sum( int[][] a, int l ) { 
    int r[] = new int[l]; 
    for ( int j = 0; j < l; j++ ) 
      for ( int i = 0; i < a.length; i++ ) 
        r[j] += a[i][j]; 
    return r; 
  } 
   
  public static double[] sum( double[][] a, int l ) { 
    double r[] = new double[l]; 
    for ( int j = 0; j < l; j++ ) 
      for ( int i = 0; i < a.length; i++ ) 
        r[j] += a[i][j]; 
    return r; 
  } 
   
  public static double sum( double [] d ) { 
    double r = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      r += d[i]; 
    return r; 
  } 
   
  public static int sum( int [] d ) { 
    int r = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      r += d[i]; 
    return r; 
  } 
   
  public static void sumeachInPlace( double [] d ) { 
    for ( int i = 1; i < d.length; i++ ) 
      d[i] = d[i-1] + d[i]; 
  } 
   
  public static void sumeachInPlace( int [] d ) { 
    for ( int i = 1; i < d.length; i++ ) 
      d[i] = d[i-1] + d[i]; 
  } 
   
  public static double[] sumeach( double [] d ) { 
    double r[] = new double[d.length]; 
    r[0] = d[0]; 
    for ( int i = 1; i < d.length; i++ ) 
      r[i] = d[i-1] + d[i]; 
    return r; 
  } 
   
  public static int[] sumeach( int [] d ) { 
    int r[] = new int[d.length]; 
    r[0] = d[0]; 
    for ( int i = 1; i < d.length; i++ ) 
      r[i] = d[i-1] + d[i]; 
    return r; 
  } 
   
  public static double sumexp( double [] d ) { 
    double r = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      r += Math.exp(d[i]); 
    return r; 
  } 
   
  public static double sumexp( int [] d ) { 
    double r = 0; 
    for ( int i = 0; i < d.length; i++ ) 
      r += Math.exp(d[i]); 
    return r; 
  } 
} 
 
    
     
     
     
     
     
     
  
  |