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

net.automatalib.util.automata.copy.PlainAutomatonCopy Maven / Gradle / Ivy

Go to download

This artifact provides various common utility operations for analyzing and manipulating automata and graphs, such as traversal, minimization and copying.

There is a newer version: 0.11.0
Show newest version
/* Copyright (C) 2013-2019 TU Dortmund
 * This file is part of AutomataLib, http://www.automatalib.net/.
 *
 * 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 net.automatalib.util.automata.copy;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;

import net.automatalib.automata.Automaton;
import net.automatalib.automata.MutableAutomaton;
import net.automatalib.ts.TransitionPredicate;

final class PlainAutomatonCopy
        extends AbstractLowLevelAutomatonCopier> {

    PlainAutomatonCopy(Automaton in,
                              Collection inputs,
                              MutableAutomaton out,
                              Function inputsMapping,
                              Function spMapping,
                              Function tpMapping,
                              Predicate stateFilter,
                              TransitionPredicate transFilter) {
        super(in, inputs, out, inputsMapping, spMapping, tpMapping, stateFilter, transFilter);
    }

    @Override
    public void doCopy() {
        List> outStates = new ArrayList<>(in.size());

        for (S1 s1 : in) {
            if (stateFilter.test(s1)) {
                S2 s2 = copyState(s1);
                outStates.add(new StateRec<>(s1, s2));
            }
        }

        for (StateRec p : outStates) {
            S1 s1 = p.inState;
            S2 s2 = p.outState;

            for (I1 i1 : inputs) {
                I2 i2 = inputsMapping.apply(i1);
                Collection transitions1 = in.getTransitions(s1, i1);
                copyTransitions(s2, i2, transitions1.stream().filter(t -> transFilter.apply(s1, i1, t)).iterator());
            }
        }

        updateInitials();
    }

    private static class StateRec {

        private final S1 inState;
        private final S2 outState;

        StateRec(S1 inState, S2 outState) {
            this.inState = inState;
            this.outState = outState;
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy