Skip to content

Commit

Permalink
move all data clamp methods to DataClampingUtils #444
Browse files Browse the repository at this point in the history
  • Loading branch information
walterxie committed Mar 25, 2024
1 parent fc2401c commit 3856117
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 23 deletions.
48 changes: 32 additions & 16 deletions lphy/src/main/java/lphy/core/parser/DataClampingUtils.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lphy.core.parser;

import lphy.core.model.RandomVariable;
import lphy.core.parser.graphicalmodel.GraphicalModel;
import lphy.core.vectorization.IID;
import lphy.core.vectorization.VectorUtils;
import lphy.core.vectorization.VectorizedDistribution;
Expand All @@ -11,53 +12,68 @@

public class DataClampingUtils {

// true if this id is contained in both the data block
// and the model block and the model id is a random variable.
public static boolean isClamped(String id, GraphicalModel graphicalModel) {
return (id != null && graphicalModel.getDataDictionary().containsKey(id) &&
graphicalModel.getModelDictionary().containsKey(id) &&
graphicalModel.getModelDictionary().get(id) instanceof RandomVariable);
}

public static boolean isDataClamping(Var var, LPhyParserDictionary parser) {
return var.getId() != null && parser.getDataDictionary().containsKey(var.getId());
return parser.isClamped(var.getId());
}

/**
* @param id id of VectorizedRandomVariable
* @param vectDist the generator
* @param dataArray data to clamp
* @return {@link VectorizedRandomVariable} for the data clamping case,
* when the generator is {@link VectorizedDistribution}.
* @param dataToClamp data to clamp
* @param id id of VectorizedRandomVariable
* @param generator the generator
* @return {@link VectorizedRandomVariable} for the data clamping case,
* when the generator is {@link VectorizedDistribution}.
*/
public static VectorizedRandomVariable getDataClampedVectorizedRandomVariable(
String id, VectorizedDistribution<?> vectDist, Object[] dataArray) {
public static VectorizedRandomVariable clampDataToVectorizedRandomVariable(
Object[] dataToClamp, String id, VectorizedDistribution<?> generator) {

List<RandomVariable> componentVariables = new ArrayList<>();
// loop through the data dataArray to clamp
Object[] objects = dataArray;
Object[] objects = dataToClamp;
for (int i = 0; i < objects.length; i++) {
Object element = objects[i];
String elemId = id + VectorUtils.INDEX_SEPARATOR + i;
// clamp data to component variables
RandomVariable compVar = new RandomVariable(elemId, element, vectDist.getBaseDistribution(i));
RandomVariable compVar = new RandomVariable(elemId, element, generator.getBaseDistribution(i));
compVar.setClamped(true);
componentVariables.add(compVar);
}
// require to wrap with VectorizedRandomVariable
VectorizedRandomVariable variable = new VectorizedRandomVariable(id, componentVariables, vectDist);
VectorizedRandomVariable variable = new VectorizedRandomVariable(id, componentVariables, generator);
variable.setClamped(true);
return variable;
}

public static VectorizedRandomVariable getDataClampedVectorizedRandomVariable(
String id, IID<?> iid, Object[] dataArray) {
/**
* @param dataToClamp data to clamp
* @param id id of VectorizedRandomVariable
* @param generator the generator
* @return {@link VectorizedRandomVariable} for the data clamping case,
* when the generator is {@link IID}.
*/
public static VectorizedRandomVariable clampDataToVectorizedRandomVariable(
Object[] dataToClamp, String id, IID<?> generator) {

List<RandomVariable> componentVariables = new ArrayList<>();
// loop through the data dataArray to clamp
Object[] objects = dataArray;
Object[] objects = dataToClamp;
for (int i = 0; i < objects.length; i++) {
Object element = objects[i];
String elemId = id + VectorUtils.INDEX_SEPARATOR + i;
// clamp data to component variables
RandomVariable compVar = new RandomVariable(elemId, element, iid.getBaseDistribution());
RandomVariable compVar = new RandomVariable(elemId, element, generator.getBaseDistribution());
compVar.setClamped(true);
componentVariables.add(compVar);
}
// require to wrap with VectorizedRandomVariable
VectorizedRandomVariable variable = new VectorizedRandomVariable(id, componentVariables, iid);
VectorizedRandomVariable variable = new VectorizedRandomVariable(id, componentVariables, generator);
variable.setClamped(true);
return variable;
}
Expand Down
8 changes: 4 additions & 4 deletions lphy/src/main/java/lphy/core/parser/LPhyListenerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,11 @@ public Value visitStoch_relation(Stoch_relationContext ctx) {
// data clamping requires to wrap the list of component RandomVariable into VectorizedRandomVariable,
// so that the equation and narrative can be generated properly
if (genDist instanceof VectorizedDistribution<?> vectDist && valueVal.getClass().isArray()) {
variable = DataClampingUtils.getDataClampedVectorizedRandomVariable(
var.getId(), vectDist, (Object[]) valueVal);
variable = DataClampingUtils.clampDataToVectorizedRandomVariable(
(Object[]) valueVal, var.getId(), vectDist);
} else if (genDist instanceof IID<?> iid && valueVal.getClass().isArray()) {
variable = DataClampingUtils.getDataClampedVectorizedRandomVariable(
var.getId(), iid, (Object[]) valueVal);
variable = DataClampingUtils.clampDataToVectorizedRandomVariable(
(Object[]) valueVal, var.getId(), iid);
} else {
// singe var
variable = new RandomVariable(var.getId(), valueVal, genDist);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lphy.core.model.RandomVariable;
import lphy.core.model.Value;
import lphy.core.parser.DataClampingUtils;

import java.util.*;

Expand Down Expand Up @@ -52,11 +53,14 @@ default boolean hasValue(String id, Context context) {
* and the model block and the model id is a random variable.
*/
default boolean isClamped(String id) {
return (id != null && getDataDictionary().containsKey(id) &&
getModelDictionary().containsKey(id) &&
getModelDictionary().get(id) instanceof RandomVariable);
return DataClampingUtils.isClamped(id, this);
}

/**
* @param value given a {@link Value}
* @return true if value is {@link RandomVariable}, which should be in model block,
* and it is clamped.
*/
default boolean isClampedVariable(Value value) {
return value instanceof RandomVariable && isClamped(value.getId());
}
Expand Down

0 comments on commit 3856117

Please sign in to comment.