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

org.chocosolver.util.objects.setDataStructures.SetFactory Maven / Gradle / Ivy

There is a newer version: 4.10.17
Show newest version
/*
 * This file is part of choco-solver, http://choco-solver.org/
 *
 * Copyright (c) 2022, IMT Atlantique. All rights reserved.
 *
 * Licensed under the BSD 4-clause license.
 *
 * See LICENSE file in the project root for full license information.
 */
/**
 * Created by IntelliJ IDEA.
 * User: Jean-Guillaume Fages
 * Date: 27/10/12
 * Time: 01:56
 */

package org.chocosolver.util.objects.setDataStructures;

import org.chocosolver.memory.IEnvironment;
import org.chocosolver.solver.Model;
import org.chocosolver.util.objects.setDataStructures.bitset.Set_BitSet;
import org.chocosolver.util.objects.setDataStructures.bitset.Set_Std_BitSet;
import org.chocosolver.util.objects.setDataStructures.constant.Set_CstInterval;
import org.chocosolver.util.objects.setDataStructures.constant.Set_FixedArray;
import org.chocosolver.util.objects.setDataStructures.iterable.IntIterableRangeSet;
import org.chocosolver.util.objects.setDataStructures.linkedlist.Set_LinkedList;
import org.chocosolver.util.objects.setDataStructures.swapList.Set_Std_Swap;
import org.chocosolver.util.objects.setDataStructures.swapList.Set_Std_Swap2;
import org.chocosolver.util.objects.setDataStructures.swapList.Set_Swap;
import org.chocosolver.util.objects.setDataStructures.swapList.Set_Swap2;

/**
 * Factory for creating sets
 *
 * @author Jean-Guillaume Fages
 * @since Oct 2012
 */
public class SetFactory {

    //***********************************************************************************
    // FACTORY - STORED SET
    //***********************************************************************************

    public static boolean HARD_CODED = true;

    /**
     * Creates a stored set of integers greater or equal than offSet
     * Such a set is restored after a backtrack
     * @param type      of set data structure
     * @param offSet	smallest value allowed in the set (possibly < 0)
     * @param model		model providing the backtracking environment
     * @return a new set which can be restored upon backtrack
     */
    public static ISet makeStoredSet(SetType type, int offSet, Model model) {
        IEnvironment environment = model.getEnvironment();
        if (HARD_CODED) {
            if (type == SetType.SMALLBIPARTITESET) {
                return new Set_Std_Swap2(environment);
            }else if (type == SetType.BIPARTITESET) {
                return new Set_Std_Swap(environment, offSet);
            }else if (type == SetType.BITSET) {
                return new Set_Std_BitSet(environment, offSet);
            }
        }
        return new StdSet(model,makeSet(type,offSet));
    }


    //***********************************************************************************
    // FACTORY - SET
    //***********************************************************************************

    /**
     * Creates an empty set of integers greater or equal than offSet
     * @param type      	implementation type
     * @param offSet		smallest value allowed in the set (possibly < 0)
     * @return a new set
     */
    public static ISet makeSet(SetType type, int offSet) {
        switch (type) {
            case RANGESET:
                return makeRangeSet();
            case BIPARTITESET:
                return makeBipartiteSet(offSet);
            case SMALLBIPARTITESET:
                return makeSmallBipartiteSet();
            case LINKED_LIST:
                return makeLinkedList();
            case BITSET:
                return makeBitSet(offSet);
            case FIXED_ARRAY: throw new UnsupportedOperationException("Please use makeConstantSet method to create a "+SetType.FIXED_ARRAY+" set");
            case FIXED_INTERVAL: throw new UnsupportedOperationException("Please use makeConstantSet method to create a "+SetType.FIXED_INTERVAL+" set");
            default:throw new UnsupportedOperationException("Unsupported SetType "+type);
        }
    }

    /**
     * Creates a set based on an ordered list of ranges
     * @return a new set
     */
    public static ISet makeRangeSet() {
        return new IntIterableRangeSet();
    }

    // --- List

    /**
     * Creates a set based on a linked list
     * appropriate when the set has only a few elements
     * @return a new set
     */
    public static ISet makeLinkedList() {
        return new Set_LinkedList();
    }

    // --- Bit Set

    /**
     * Creates a set of integers, based on an offseted BitSet,
     * Supports integers greater or equal than offSet
     * @param offSet	smallest value allowed in the set (possibly < 0)
     * @return a new set
     */
    public static ISet makeBitSet(int offSet) {
        return new Set_BitSet(offSet);
    }

    // --- Bipartite Set

    /**
     * Creates a set of integers, based on an offseted bipartite set,
     * Supports integers greater or equal than offSet
     * Optimal complexity
     * @param offSet	smallest value allowed in the set (possibly < 0)
     * @return a new bipartite set
     */
    public static ISet makeBipartiteSet(int offSet) {
        return new Set_Swap(offSet);
    }

    /**
     * Creates a set of integers, based on an offseted bipartite set, for small sets
     * (arraylist inside to consume less memory)
     * @return a new bipartite set
     */
    public static ISet makeSmallBipartiteSet() {
        return new Set_Swap2();
    }

    // --- Constant Set

    /**
     * Creates a fixed set of integers, equal to cst
     * @param cst	set value
     * @return a fixed set
     */
    public static ISet makeConstantSet(int[] cst) {
        return new Set_FixedArray(cst);
    }

    /**
     * Creates a constant set of integers represented with an interval [lb, ub]
     * @return a new interval (constant)
     */
    public static ISet makeConstantSet(int lb, int ub) {
        return new Set_CstInterval(lb, ub);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy