/******************************************************************************* * Copyright 2014 Analog Devices, Inc. * * Licensed 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 com.analog.lyric.dimple.solvers.optimizedupdate; import org.eclipse.jdt.annotation.Nullable; import com.analog.lyric.util.misc.Internal; /** * Stores information related to the optimized update algorithm for a given factor table. Various * factors in a graph that share a factor table may have different option settings. During solver * graph initialization, the schedule is iterated to find the factors that shall have update applied * to them, and their option values. These option values are analyzed in order to set up an instance * of this class for each unique factor table. Later, during solver factor initialization, the * information is used to configure each factor's update. * * @since 0.07 * @author jking */ @Internal final public class FactorTableUpdateSettings { /** * The update approach for the factor as specified in the options, which may include * {@link UpdateApproach#AUTOMATIC}. */ private @Nullable UpdateApproach _approach = null; /** * Valid (non-null) only for those factors that have their update approach set to * {@link UpdateApproach#AUTOMATIC}, and only after the solver graph has * initialized. Indicates the update approach selected. */ private @Nullable UpdateApproach _automaticApproachDecision = null; /** * Valid (non-null) only for those factors that employ the optimized update algorithm, and only * after the solver graph has been initialized. */ private @Nullable FactorUpdatePlan _updatePlan; /** * Quantity of factors that share the represented factor table. */ private int _factorCount = 0; /** * Execution time scaling factor for weighing execution time and memory allocation costs. */ private double _executionTimeScalingFactor; /** * Users may set options at various levels, such as on the solver factor, the solver graph, the * model factor, the model graph, or perhaps others. When multiple factors share a factor table, * we track the level in order to retain the most specific settings. The lower the value, the * more specific it is. */ private int _optionLevel = -1; /** * Memory allocation scaling factor for weighing execution time and memory allocation costs. */ private double _memoryAllocationScalingFactor; /** * Density, below which the optimized update algorithm will use a sparse representation for its * auxiliary factor tables. */ private double _sparseThreshold; public @Nullable UpdateApproach getApproach() { return _approach; } public @Nullable UpdateApproach getAutomaticUpdateApproach() { return _automaticApproachDecision; } public int getCount() { return _factorCount; } public double getExecutionTimeScalingFactor() { return _executionTimeScalingFactor; } public int getLevel() { return _optionLevel; } public double getMemoryAllocationScalingFactor() { return _memoryAllocationScalingFactor; } public @Nullable FactorUpdatePlan getOptimizedUpdatePlan() { return _updatePlan; } public double getSparseThreshold() { return _sparseThreshold; } public void setApproach(UpdateApproach approach) { this._approach = approach; } public void setAutomaticUpdateApproach(@Nullable UpdateApproach updateApproach) { _automaticApproachDecision = updateApproach; } public void setCount(int count) { this._factorCount = count; } public void setExecutionTimeScalingFactor(double executionTimeScalingFactor) { this._executionTimeScalingFactor = executionTimeScalingFactor; } public void setLevel(int level) { this._optionLevel = level; } public void setMemoryAllocationScalingFactor(double memoryAllocationScalingFactor) { this._memoryAllocationScalingFactor = memoryAllocationScalingFactor; } public void setOptimizedUpdatePlan(@Nullable FactorUpdatePlan updatePlan) { _updatePlan = updatePlan; } public void setSparseThreshold(double sparseThreshold) { this._sparseThreshold = sparseThreshold; } }