All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrapht.alg.matching.blossom.v5.BlossomVOptions Maven / Gradle / Ivy

The newest version!
/*
 * (C) Copyright 2018-2023, by Timofey Chudakov and Contributors.
 *
 * JGraphT : a free Java graph-theory library
 *
 * See the CONTRIBUTORS.md file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the
 * GNU Lesser General Public License v2.1 or later
 * which is available at
 * http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR LGPL-2.1-or-later
 */
package org.jgrapht.alg.matching.blossom.v5;

import static org.jgrapht.alg.matching.blossom.v5.BlossomVOptions.DualUpdateStrategy.MULTIPLE_TREE_CONNECTED_COMPONENTS;
import static org.jgrapht.alg.matching.blossom.v5.BlossomVOptions.DualUpdateStrategy.MULTIPLE_TREE_FIXED_DELTA;
import static org.jgrapht.alg.matching.blossom.v5.BlossomVOptions.InitializationType.*;

/**
 * BlossomVOptions that define the strategies to use during the algorithm for updating duals and
 * initializing the matching
 * 

* According to the experimental results, the greedy initialization substantially speeds up the * algorithm. */ public class BlossomVOptions { /** * All possible options */ public static final BlossomVOptions[] ALL_OPTIONS = new BlossomVOptions[] { new BlossomVOptions(NONE, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, true), // [0] new BlossomVOptions(NONE, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, false), // [1] new BlossomVOptions(NONE, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, true), // [2] new BlossomVOptions(NONE, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, false), // [3] new BlossomVOptions(NONE, MULTIPLE_TREE_FIXED_DELTA, true, true), // [4] new BlossomVOptions(NONE, MULTIPLE_TREE_FIXED_DELTA, true, false), // [5] new BlossomVOptions(NONE, MULTIPLE_TREE_FIXED_DELTA, false, true), // [6] new BlossomVOptions(NONE, MULTIPLE_TREE_FIXED_DELTA, false, false), // [7] new BlossomVOptions(GREEDY, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, true), // [8] new BlossomVOptions(GREEDY, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, false), // [9] new BlossomVOptions(GREEDY, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, true), // [10] new BlossomVOptions(GREEDY, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, false), // [11] new BlossomVOptions(GREEDY, MULTIPLE_TREE_FIXED_DELTA, true, true), // [12] new BlossomVOptions(GREEDY, MULTIPLE_TREE_FIXED_DELTA, true, false), // [13] new BlossomVOptions(GREEDY, MULTIPLE_TREE_FIXED_DELTA, false, true), // [14] new BlossomVOptions(GREEDY, MULTIPLE_TREE_FIXED_DELTA, false, true), // [15] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, true), // [16] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_CONNECTED_COMPONENTS, true, false), // [17] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, true), // [18] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_CONNECTED_COMPONENTS, false, false), // [19] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_FIXED_DELTA, true, true), // [20] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_FIXED_DELTA, true, false), // [21] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_FIXED_DELTA, false, true), // [22] new BlossomVOptions(FRACTIONAL, MULTIPLE_TREE_FIXED_DELTA, false, true), // [23] }; /** * Default algorithm initialization type */ private static final InitializationType DEFAULT_INITIALIZATION_TYPE = FRACTIONAL; /** * Default dual updates strategy */ private static final DualUpdateStrategy DEFAULT_DUAL_UPDATE_TYPE = MULTIPLE_TREE_FIXED_DELTA; /** * Default value for the flag {@link BlossomVOptions#updateDualsBefore} */ private static final boolean DEFAULT_UPDATE_DUALS_BEFORE = true; /** * Default value for the flag {@link BlossomVOptions#updateDualsAfter} */ private static final boolean DEFAULT_UPDATE_DUALS_AFTER = false; /** * What greedy strategy to use to perform a global dual update */ DualUpdateStrategy dualUpdateStrategy; /** * What strategy to choose to initialize the matching before the main phase of the algorithm */ InitializationType initializationType; /** * Whether to update duals of the tree before growth */ boolean updateDualsBefore; /** * Whether to update duals of the tree after growth */ boolean updateDualsAfter; /** * Constructs a custom set of options for the algorithm * * @param dualUpdateStrategy greedy strategy to update dual variables globally * @param initializationType strategy for initializing the matching * @param updateDualsBefore whether to update duals of the tree before growth * @param updateDualsAfter whether to update duals of the tree after growth */ public BlossomVOptions( InitializationType initializationType, DualUpdateStrategy dualUpdateStrategy, boolean updateDualsBefore, boolean updateDualsAfter) { this.dualUpdateStrategy = dualUpdateStrategy; this.initializationType = initializationType; this.updateDualsBefore = updateDualsBefore; this.updateDualsAfter = updateDualsAfter; } /** * Constructs a new options instance with a {@code initializationType} * * @param initializationType defines a strategy to use to initialize the matching */ public BlossomVOptions(InitializationType initializationType) { this( initializationType, DEFAULT_DUAL_UPDATE_TYPE, DEFAULT_UPDATE_DUALS_BEFORE, DEFAULT_UPDATE_DUALS_AFTER); } /** * Constructs a default set of options for the algorithm */ public BlossomVOptions() { this( DEFAULT_INITIALIZATION_TYPE, DEFAULT_DUAL_UPDATE_TYPE, DEFAULT_UPDATE_DUALS_BEFORE, DEFAULT_UPDATE_DUALS_AFTER); } @Override public String toString() { return "BlossomVOptions{initializationType=" + initializationType + ", dualUpdateStrategy=" + dualUpdateStrategy + ", updateDualsBefore=" + updateDualsBefore + ", updateDualsAfter=" + updateDualsAfter + '}'; } /** * Returns the {@link BlossomVOptions#updateDualsBefore} flag * * @return the flag {@link BlossomVOptions#updateDualsBefore} */ public boolean isUpdateDualsBefore() { return updateDualsBefore; } /** * Returns the {@link BlossomVOptions#updateDualsAfter} flag * * @return the flag {@link BlossomVOptions#updateDualsAfter} */ public boolean isUpdateDualsAfter() { return updateDualsAfter; } /** * Returns dual updates strategy * * @return dual updates strategy */ public DualUpdateStrategy getDualUpdateStrategy() { return dualUpdateStrategy; } /** * Returns initialization type * * @return initialization type */ public InitializationType getInitializationType() { return initializationType; } /** * Enum for choosing dual updates strategy */ public enum DualUpdateStrategy { MULTIPLE_TREE_FIXED_DELTA { @Override public String toString() { return "Multiple tree fixed delta"; } }, MULTIPLE_TREE_CONNECTED_COMPONENTS { @Override public String toString() { return "Multiple tree connected components"; } }; /** * Returns the name of the dual updates strategy * * @return the name of the dual updates strategy */ @Override public abstract String toString(); } /** * Enum for types of matching initialization */ public enum InitializationType { GREEDY { @Override public String toString() { return "Greedy initialization"; } }, NONE { @Override public String toString() { return "None"; } }, FRACTIONAL { @Override public String toString() { return "Fractional matching initializations"; } }; /** * Returns the name of the initialization type * * @return the name of the initialization type */ @Override public abstract String toString(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy