/*************************************************************************/
/*                                                                       */
/*  Copyright (c) 1994 Stanford University                               */
/*                                                                       */
/*  All rights reserved.                                                 */
/*                                                                       */
/*  Permission is given to use, copy, and modify this software for any   */
/*  non-commercial purpose as long as this copyright notice is not       */
/*  removed.  All other uses, including redistribution in whole or in    */
/*  part, are forbidden without prior written permission.                */
/*                                                                       */
/*  This software is provided with absolutely no warranty and no         */
/*  support.                                                             */
/*                                                                       */
/*************************************************************************/

EXTERN_ENV

#include <math.h>
#include "matrix.h"

#define MISS_COST 4.74
#define ALPHA 100
#define BETA 10
#define TIME(ops,misses) (ops+(misses)*MISS_COST)/(1.0+MISS_COST/BS)

extern BMatrix LB;
extern int P;
extern int BS;
double *opStats = NULL;
double seq_time, seq_ops, seq_misses;

PDIV(src_col, src_nz, ops, misses, runtime)
double *ops, *misses, *runtime;
{
  int super_size, passes;
  double this_ops, this_misses;

  super_size = src_col*src_nz - src_col*(src_col-1)/2;
  this_ops = 1.0*src_col*(src_col+1)*(2*src_col+1)/6;
  this_ops += 1.0*src_col*src_col*(src_nz-src_col);
  *ops += this_ops;

  passes = (src_col+BS-1)/BS;
  this_misses = 2.0*passes/3*super_size;
  *misses += this_misses;

  *runtime += TIME(this_ops, this_misses);
}


PMOD(src_col, dest_col, dest_nz, ops, misses, runtime)
double *ops, *misses, *runtime;
{
  int update_size, passes_src, passes_dest;
  double this_ops, this_misses;

  update_size = dest_col*dest_nz - dest_col*(dest_col-1)/2;
  this_ops = 2.0*src_col*update_size;
  *ops += this_ops;

  passes_src = (src_col+BS-1)/BS;
  passes_dest =  (dest_col+BS-1)/BS;
  if (passes_src == 1 && passes_dest == 1)
    /* just miss on source and dest once */
    this_misses = 1.0*src_col*dest_nz + 1.0*update_size;
  else
    this_misses = 1.0*passes_dest*src_col*dest_nz + 1.0*passes_src*update_size;
  *misses += this_misses;

  *runtime += TIME(this_ops, this_misses);
}

PADD(cols, rows, misses, runtime)
double *misses, *runtime;
{
  double this_misses;

  this_misses = 2*(rows*cols-cols*(cols-1)/2);
  *misses += this_misses;

  *runtime += TIME(0, this_misses);
}


AssignBlocksNow(distribute)
{
  int i, j, which;

  if (P == 1) {
    for (j=0; j<LB.n; j+=LB.partition_size[j])
      if (!LB.domain[j])
	for (i=LB.col[j]; i<LB.col[j+1]; i++)
	  BLOCK(i)->owner = 0;
  } else {
    EmbedBlocks(P);
  }
}


EmbedBlocks(P)
{
  int j, block;
  extern int scatter_decomposition;

  /* number the block partitions */

  for (j=0; j<LB.n; j+=LB.partition_size[j])
    if (!LB.domain[j]) {
      for (block=LB.col[j]; block<LB.col[j+1]; block++) {
	BLOCK(block)->owner = EmbeddedOwner(block);
      }
    }

  scatter_decomposition = 1;
}

