blob: 1730c5a45a4eb989031a265267d5a614bc2368f7 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sysds.runtime.lineage;
import org.apache.sysds.runtime.controlprogram.caching.CacheableData;
import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
import org.apache.sysds.runtime.instructions.Instruction;
import org.apache.sysds.runtime.instructions.cp.*;
import org.apache.sysds.runtime.matrix.data.MatrixBlock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Queue;
import java.util.LinkedList;
public class LineageDebugger {
public static final int POS_NAN = 0;
public static final int POS_POSITIVE_INFINITY = 1;
public static final int POS_NEGATIVE_INFINITY = 2;
public static void maintainSpecialValueBits(Lineage lineage, Instruction inst, ExecutionContext ec) {
ArrayList<CPOperand> outputs = new ArrayList<>();
// Only CP instructions are supported right now
CPOperand singleOutput =
inst instanceof ComputationCPInstruction ? ((ComputationCPInstruction) inst).getOutput() :
inst instanceof BuiltinNaryCPInstruction ? ((BuiltinNaryCPInstruction) inst).getOutput() :
inst instanceof SqlCPInstruction ? ((SqlCPInstruction) inst).getOutput() :
inst instanceof VariableCPInstruction ? ((VariableCPInstruction) inst).getOutput() :
null;
if (singleOutput != null)
outputs.add(singleOutput);
Collection<CPOperand> multiOutputs =
inst instanceof MultiReturnBuiltinCPInstruction ? ((MultiReturnBuiltinCPInstruction) inst).getOutputs() :
inst instanceof MultiReturnParameterizedBuiltinCPInstruction ? ((MultiReturnParameterizedBuiltinCPInstruction) inst).getOutputs() :
null;
if (multiOutputs != null)
outputs.addAll(multiOutputs);
for (CPOperand output : outputs) {
CacheableData<MatrixBlock> cd = ec.getMatrixObject(output);
MatrixBlock mb = cd.acquireReadAndRelease();
LineageItem li = lineage.get(output);
updateSpecialValueBit(mb, li, POS_NAN, Double.NaN);
updateSpecialValueBit(mb, li, POS_POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
updateSpecialValueBit(mb, li, POS_NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
}
}
public static LineageItem firstOccurrenceOfNR(LineageItem li, int pos) {
if (!li.getSpecialValueBit(pos))
return null;
LineageItem tmp;
Queue<LineageItem> q = new LinkedList<>();
q.add(li);
while ((tmp = q.poll()) != null) {
if (tmp.isVisited())
continue;
if (tmp.getInputs() != null) {
boolean flag = false;
for (LineageItem in : tmp.getInputs()) {
flag |= in.getSpecialValueBit(pos);
q.add(in);
}
if (!flag)
break;
}
tmp.setVisited(true);
}
li.resetVisitStatusNR();
return tmp;
}
private static void updateSpecialValueBit(MatrixBlock mb, LineageItem li, int pos, double pattern) {
boolean flag = false;
for (LineageItem input : li.getInputs()) {
if (input.getSpecialValueBit(pos)) {
flag = true;
break;
}
}
flag |= mb.containsValue(pattern);
li.setSpecialValueBit(pos, flag);
}
}