use of org.apache.sysml.runtime.instructions.mr.GroupedAggregateInstruction in project incubator-systemml by apache.
the class CostEstimatorStaticRuntime method extractMRInstStatistics.
private Object[] extractMRInstStatistics(String inst, VarStats[] stats) {
// stats, attrs
Object[] ret = new Object[2];
VarStats[] vs = new VarStats[3];
String[] attr = null;
String[] parts = InstructionUtils.getInstructionParts(inst);
String opcode = parts[0];
if (opcode.equals(DataGen.RAND_OPCODE)) {
vs[0] = _unknownStats;
vs[1] = _unknownStats;
vs[2] = stats[Integer.parseInt(parts[2])];
int type = 2;
// awareness of instruction patching min/max
if (!parts[7].contains(Lop.VARIABLE_NAME_PLACEHOLDER) && !parts[8].contains(Lop.VARIABLE_NAME_PLACEHOLDER)) {
double minValue = Double.parseDouble(parts[7]);
double maxValue = Double.parseDouble(parts[8]);
double sparsity = Double.parseDouble(parts[9]);
if (minValue == 0.0 && maxValue == 0.0)
type = 0;
else if (sparsity == 1.0 && minValue == maxValue)
type = 1;
}
attr = new String[] { String.valueOf(type) };
}
if (opcode.equals(DataGen.SEQ_OPCODE)) {
vs[0] = _unknownStats;
vs[1] = _unknownStats;
vs[2] = stats[Integer.parseInt(parts[2])];
} else // general case
{
String inst2 = replaceInstructionPatch(inst);
MRInstruction mrinst = MRInstructionParser.parseSingleInstruction(inst2);
if (mrinst instanceof UnaryMRInstructionBase) {
UnaryMRInstructionBase uinst = (UnaryMRInstructionBase) mrinst;
vs[0] = uinst.input >= 0 ? stats[uinst.input] : _unknownStats;
vs[1] = _unknownStats;
vs[2] = stats[uinst.output];
if (// scalar input, e.g., print
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar output
vs[2] == null)
vs[2] = _scalarStats;
if (mrinst instanceof MMTSJMRInstruction) {
String type = ((MMTSJMRInstruction) mrinst).getMMTSJType().toString();
attr = new String[] { type };
} else if (mrinst instanceof CM_N_COVInstruction) {
if (opcode.equals("cm"))
attr = new String[] { parts[parts.length - 2] };
} else if (mrinst instanceof GroupedAggregateInstruction) {
if (opcode.equals("groupedagg")) {
AggregateOperationTypes type = CMOperator.getAggOpType(parts[2], parts[3]);
attr = new String[] { String.valueOf(type.ordinal()) };
}
}
} else if (mrinst instanceof BinaryMRInstructionBase) {
BinaryMRInstructionBase binst = (BinaryMRInstructionBase) mrinst;
vs[0] = stats[binst.input1];
vs[1] = stats[binst.input2];
vs[2] = stats[binst.output];
if (// scalar input,
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar input,
vs[1] == null)
vs[1] = _scalarStats;
if (// scalar output
vs[2] == null)
vs[2] = _scalarStats;
if (opcode.equals("rmempty")) {
RemoveEmptyMRInstruction rbinst = (RemoveEmptyMRInstruction) mrinst;
attr = new String[] { rbinst.isRemoveRows() ? "0" : "1" };
}
} else if (mrinst instanceof TernaryInstruction) {
TernaryInstruction tinst = (TernaryInstruction) mrinst;
byte[] ix = tinst.getAllIndexes();
for (int i = 0; i < ix.length - 1; i++) vs[0] = stats[ix[i]];
vs[2] = stats[ix[ix.length - 1]];
if (// scalar input,
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar input,
vs[1] == null)
vs[1] = _scalarStats;
if (// scalar output
vs[2] == null)
vs[2] = _scalarStats;
} else if (mrinst instanceof CtableInstruction) {
CtableInstruction tinst = (CtableInstruction) mrinst;
vs[0] = stats[tinst.input1];
vs[1] = stats[tinst.input2];
vs[2] = stats[tinst.input3];
if (// scalar input,
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar input,
vs[1] == null)
vs[1] = _scalarStats;
if (// scalar input
vs[2] == null)
vs[2] = _scalarStats;
} else if (mrinst instanceof PickByCountInstruction) {
PickByCountInstruction pinst = (PickByCountInstruction) mrinst;
vs[0] = stats[pinst.input1];
vs[2] = stats[pinst.output];
if (// scalar input,
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar input,
vs[1] == null)
vs[1] = _scalarStats;
if (// scalar input
vs[2] == null)
vs[2] = _scalarStats;
} else if (mrinst instanceof MapMultChainInstruction) {
MapMultChainInstruction minst = (MapMultChainInstruction) mrinst;
vs[0] = stats[minst.getInput1()];
vs[1] = stats[minst.getInput2()];
if (minst.getInput3() >= 0)
vs[2] = stats[minst.getInput3()];
if (// scalar input,
vs[0] == null)
vs[0] = _scalarStats;
if (// scalar input,
vs[1] == null)
vs[1] = _scalarStats;
if (// scalar input
vs[2] == null)
vs[2] = _scalarStats;
}
}
// maintain var status (CP output always inmem)
vs[2]._inmem = true;
ret[0] = vs;
ret[1] = attr;
return ret;
}
use of org.apache.sysml.runtime.instructions.mr.GroupedAggregateInstruction in project incubator-systemml by apache.
the class MatrixCharacteristics method computeDimension.
public static void computeDimension(HashMap<Byte, MatrixCharacteristics> dims, MRInstruction ins) {
MatrixCharacteristics dimOut = dims.get(ins.output);
if (dimOut == null) {
dimOut = new MatrixCharacteristics();
dims.put(ins.output, dimOut);
}
if (ins instanceof ReorgInstruction) {
ReorgInstruction realIns = (ReorgInstruction) ins;
reorg(dims.get(realIns.input), (ReorgOperator) realIns.getOperator(), dimOut);
} else if (ins instanceof AppendInstruction) {
AppendInstruction realIns = (AppendInstruction) ins;
MatrixCharacteristics in_dim1 = dims.get(realIns.input1);
MatrixCharacteristics in_dim2 = dims.get(realIns.input2);
if (realIns.isCBind())
dimOut.set(in_dim1.numRows, in_dim1.numColumns + in_dim2.numColumns, in_dim1.numRowsPerBlock, in_dim2.numColumnsPerBlock);
else
dimOut.set(in_dim1.numRows + in_dim2.numRows, in_dim1.numColumns, in_dim1.numRowsPerBlock, in_dim2.numColumnsPerBlock);
} else if (ins instanceof CumulativeAggregateInstruction) {
AggregateUnaryInstruction realIns = (AggregateUnaryInstruction) ins;
MatrixCharacteristics in = dims.get(realIns.input);
dimOut.set((long) Math.ceil((double) in.getRows() / in.getRowsPerBlock()), in.getCols(), in.getRowsPerBlock(), in.getColsPerBlock());
} else if (ins instanceof AggregateUnaryInstruction) {
AggregateUnaryInstruction realIns = (AggregateUnaryInstruction) ins;
aggregateUnary(dims.get(realIns.input), (AggregateUnaryOperator) realIns.getOperator(), dimOut);
} else if (ins instanceof AggregateBinaryInstruction) {
AggregateBinaryInstruction realIns = (AggregateBinaryInstruction) ins;
aggregateBinary(dims.get(realIns.input1), dims.get(realIns.input2), (AggregateBinaryOperator) realIns.getOperator(), dimOut);
} else if (ins instanceof MapMultChainInstruction) {
// output size independent of chain type
MapMultChainInstruction realIns = (MapMultChainInstruction) ins;
MatrixCharacteristics mc1 = dims.get(realIns.getInput1());
MatrixCharacteristics mc2 = dims.get(realIns.getInput2());
dimOut.set(mc1.numColumns, mc2.numColumns, mc1.numRowsPerBlock, mc1.numColumnsPerBlock);
} else if (ins instanceof QuaternaryInstruction) {
QuaternaryInstruction realIns = (QuaternaryInstruction) ins;
MatrixCharacteristics mc1 = dims.get(realIns.getInput1());
MatrixCharacteristics mc2 = dims.get(realIns.getInput2());
MatrixCharacteristics mc3 = dims.get(realIns.getInput3());
realIns.computeMatrixCharacteristics(mc1, mc2, mc3, dimOut);
} else if (ins instanceof ReblockInstruction) {
ReblockInstruction realIns = (ReblockInstruction) ins;
MatrixCharacteristics in_dim = dims.get(realIns.input);
dimOut.set(in_dim.numRows, in_dim.numColumns, realIns.brlen, realIns.bclen, in_dim.nonZero);
} else if (ins instanceof MatrixReshapeMRInstruction) {
MatrixReshapeMRInstruction mrinst = (MatrixReshapeMRInstruction) ins;
MatrixCharacteristics in_dim = dims.get(mrinst.input);
dimOut.set(mrinst.getNumRows(), mrinst.getNumColunms(), in_dim.getRowsPerBlock(), in_dim.getColsPerBlock(), in_dim.getNonZeros());
} else if (ins instanceof RandInstruction || ins instanceof SeqInstruction) {
DataGenMRInstruction dataIns = (DataGenMRInstruction) ins;
dimOut.set(dims.get(dataIns.getInput()));
} else if (ins instanceof ReplicateInstruction) {
ReplicateInstruction realIns = (ReplicateInstruction) ins;
realIns.computeOutputDimension(dims.get(realIns.input), dimOut);
} else if (// before unary
ins instanceof ParameterizedBuiltinMRInstruction) {
ParameterizedBuiltinMRInstruction realIns = (ParameterizedBuiltinMRInstruction) ins;
realIns.computeOutputCharacteristics(dims.get(realIns.input), dimOut);
} else if (ins instanceof ScalarInstruction || ins instanceof AggregateInstruction || (ins instanceof UnaryInstruction && !(ins instanceof MMTSJMRInstruction)) || ins instanceof ZeroOutInstruction) {
UnaryMRInstructionBase realIns = (UnaryMRInstructionBase) ins;
dimOut.set(dims.get(realIns.input));
} else if (ins instanceof MMTSJMRInstruction) {
MMTSJMRInstruction mmtsj = (MMTSJMRInstruction) ins;
MMTSJType tstype = mmtsj.getMMTSJType();
MatrixCharacteristics mc = dims.get(mmtsj.input);
dimOut.set(tstype.isLeft() ? mc.numColumns : mc.numRows, tstype.isLeft() ? mc.numColumns : mc.numRows, mc.numRowsPerBlock, mc.numColumnsPerBlock);
} else if (ins instanceof PMMJMRInstruction) {
PMMJMRInstruction pmmins = (PMMJMRInstruction) ins;
MatrixCharacteristics mc = dims.get(pmmins.input2);
dimOut.set(pmmins.getNumRows(), mc.numColumns, mc.numRowsPerBlock, mc.numColumnsPerBlock);
} else if (ins instanceof RemoveEmptyMRInstruction) {
RemoveEmptyMRInstruction realIns = (RemoveEmptyMRInstruction) ins;
MatrixCharacteristics mc = dims.get(realIns.input1);
long min = realIns.isEmptyReturn() ? 1 : 0;
if (realIns.isRemoveRows())
dimOut.set(Math.max(realIns.getOutputLen(), min), mc.getCols(), mc.numRowsPerBlock, mc.numColumnsPerBlock);
else
dimOut.set(mc.getRows(), Math.max(realIns.getOutputLen(), min), mc.numRowsPerBlock, mc.numColumnsPerBlock);
} else if (// needs to be checked before binary
ins instanceof UaggOuterChainInstruction) {
UaggOuterChainInstruction realIns = (UaggOuterChainInstruction) ins;
MatrixCharacteristics mc1 = dims.get(realIns.input1);
MatrixCharacteristics mc2 = dims.get(realIns.input2);
realIns.computeOutputCharacteristics(mc1, mc2, dimOut);
} else if (ins instanceof GroupedAggregateMInstruction) {
GroupedAggregateMInstruction realIns = (GroupedAggregateMInstruction) ins;
MatrixCharacteristics mc1 = dims.get(realIns.input1);
realIns.computeOutputCharacteristics(mc1, dimOut);
} else if (ins instanceof BinaryInstruction || ins instanceof BinaryMInstruction || ins instanceof CombineBinaryInstruction) {
BinaryMRInstructionBase realIns = (BinaryMRInstructionBase) ins;
MatrixCharacteristics mc1 = dims.get(realIns.input1);
MatrixCharacteristics mc2 = dims.get(realIns.input2);
if (mc1.getRows() > 1 && mc1.getCols() == 1 && mc2.getRows() == 1 && // outer
mc2.getCols() > 1) {
dimOut.set(mc1.getRows(), mc2.getCols(), mc1.getRowsPerBlock(), mc2.getColsPerBlock());
} else {
// default case
dimOut.set(mc1);
}
} else if (ins instanceof TernaryInstruction) {
dimOut.set(dims.get(ins.getInputIndexes()[0]));
} else if (ins instanceof CombineTernaryInstruction) {
CtableInstruction realIns = (CtableInstruction) ins;
dimOut.set(dims.get(realIns.input1));
} else if (ins instanceof CombineUnaryInstruction) {
dimOut.set(dims.get(((CombineUnaryInstruction) ins).input));
} else if (ins instanceof CM_N_COVInstruction || ins instanceof GroupedAggregateInstruction) {
dimOut.set(1, 1, 1, 1);
} else if (ins instanceof RangeBasedReIndexInstruction) {
RangeBasedReIndexInstruction realIns = (RangeBasedReIndexInstruction) ins;
MatrixCharacteristics dimIn = dims.get(realIns.input);
realIns.computeOutputCharacteristics(dimIn, dimOut);
} else if (ins instanceof CtableInstruction) {
CtableInstruction realIns = (CtableInstruction) ins;
MatrixCharacteristics in_dim = dims.get(realIns.input1);
dimOut.set(realIns.getOutputDim1(), realIns.getOutputDim2(), in_dim.numRowsPerBlock, in_dim.numColumnsPerBlock);
} else {
/*
* if ins is none of the above cases then we assume that dim_out dimensions are unknown
*/
dimOut.numRows = -1;
dimOut.numColumns = -1;
dimOut.numRowsPerBlock = 1;
dimOut.numColumnsPerBlock = 1;
}
}
use of org.apache.sysml.runtime.instructions.mr.GroupedAggregateInstruction in project incubator-systemml by apache.
the class GroupedAggMRCombiner method reduce.
@Override
public void reduce(TaggedMatrixIndexes key, Iterator<WeightedCell> values, OutputCollector<TaggedMatrixIndexes, WeightedCell> out, Reporter reporter) throws IOException {
long start = System.currentTimeMillis();
// get aggregate operator
GroupedAggregateInstruction ins = grpaggInstructions.get(key.getTag());
Operator op = ins.getOperator();
boolean isPartialAgg = true;
// combine iterator to single value
try {
if (// everything except sum
op instanceof CMOperator) {
if (((CMOperator) op).isPartialAggregateOperator()) {
cmObj.reset();
CM lcmFn = cmFn.get(key.getTag());
// partial aggregate cm operator
while (values.hasNext()) {
WeightedCell value = values.next();
lcmFn.execute(cmObj, value.getValue(), value.getWeight());
}
outCell.setValue(cmObj.getRequiredPartialResult(op));
outCell.setWeight(cmObj.getWeight());
} else // forward tuples to reducer
{
isPartialAgg = false;
while (values.hasNext()) out.collect(key, values.next());
}
} else if (// sum
op instanceof AggregateOperator) {
AggregateOperator aggop = (AggregateOperator) op;
if (aggop.correctionExists) {
KahanObject buffer = new KahanObject(aggop.initialValue, 0);
KahanPlus.getKahanPlusFnObject();
// partial aggregate with correction
while (values.hasNext()) {
WeightedCell value = values.next();
aggop.increOp.fn.execute(buffer, value.getValue() * value.getWeight());
}
outCell.setValue(buffer._sum);
outCell.setWeight(1);
} else // no correction
{
double v = aggop.initialValue;
// partial aggregate without correction
while (values.hasNext()) {
WeightedCell value = values.next();
v = aggop.increOp.fn.execute(v, value.getValue() * value.getWeight());
}
outCell.setValue(v);
outCell.setWeight(1);
}
} else
throw new IOException("Unsupported operator in instruction: " + ins);
} catch (Exception ex) {
throw new IOException(ex);
}
// collect the output (to reducer)
if (isPartialAgg)
out.collect(key, outCell);
reporter.incrCounter(Counters.COMBINE_OR_REDUCE_TIME, System.currentTimeMillis() - start);
}
use of org.apache.sysml.runtime.instructions.mr.GroupedAggregateInstruction in project incubator-systemml by apache.
the class GroupedAggMRMapper method configure.
@Override
public void configure(JobConf job) {
super.configure(job);
try {
GroupedAggregateInstruction[] grpaggIns = MRJobConfiguration.getGroupedAggregateInstructions(job);
if (grpaggIns == null)
throw new RuntimeException("no GroupAggregate Instructions found!");
ArrayList<GroupedAggregateInstruction> vec = new ArrayList<>();
for (int i = 0; i < representativeMatrixes.size(); i++) {
byte input = representativeMatrixes.get(i);
for (GroupedAggregateInstruction ins : grpaggIns) if (ins.input == input)
vec.add(ins);
groupAgg_instructions.add(vec);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of org.apache.sysml.runtime.instructions.mr.GroupedAggregateInstruction in project incubator-systemml by apache.
the class GroupedAggMRReducer method reduce.
@Override
public void reduce(TaggedMatrixIndexes key, Iterator<WeightedCell> values, OutputCollector<MatrixIndexes, MatrixCell> out, Reporter report) throws IOException {
commonSetup(report);
// get operator
GroupedAggregateInstruction ins = grpaggInstructions.get(key.getTag());
Operator op = ins.getOperator();
try {
if (// all, but sum
op instanceof CMOperator) {
cmObj.reset();
CM lcmFn = cmFn.get(key.getTag());
while (values.hasNext()) {
WeightedCell value = values.next();
lcmFn.execute(cmObj, value.getValue(), value.getWeight());
}
outCell.setValue(cmObj.getRequiredResult(op));
} else if (// sum
op instanceof AggregateOperator) {
AggregateOperator aggop = (AggregateOperator) op;
if (aggop.correctionExists) {
KahanObject buffer = new KahanObject(aggop.initialValue, 0);
while (values.hasNext()) {
WeightedCell value = values.next();
aggop.increOp.fn.execute(buffer, value.getValue() * value.getWeight());
}
outCell.setValue(buffer._sum);
} else {
double v = aggop.initialValue;
while (values.hasNext()) {
WeightedCell value = values.next();
v = aggop.increOp.fn.execute(v, value.getValue() * value.getWeight());
}
outCell.setValue(v);
}
} else
throw new IOException("Unsupported operator in instruction: " + ins);
} catch (Exception ex) {
throw new IOException(ex);
}
outIndex.setIndexes(key.getBaseObject());
cachedValues.reset();
cachedValues.set(key.getTag(), outIndex, outCell);
processReducerInstructions();
// output the final result matrices
outputResultsFromCachedValues(report);
}
Aggregations