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

org.integratedmodelling.engine.modelling.runtime.mediators.GridToGrid Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (C) 2007, 2015:
 * 
 * - Ferdinando Villa  - integratedmodelling.org - any
 * other authors listed in @author annotations
 *
 * All rights reserved. This file is part of the k.LAB software suite, meant to enable
 * modular, collaborative, integrated development of interoperable data and model
 * components. For details, see http://integratedmodelling.org.
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms
 * of the Affero General Public License Version 3 or any later version.
 *
 * This program is distributed in the hope that it will be useful, but without any
 * warranty; without even the implied warranty of merchantability or fitness for a
 * particular purpose. See the Affero General Public License for more details.
 * 
 * You should have received a copy of the Affero General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite
 * 330, Boston, MA 02111-1307, USA. The license is also available at:
 * https://www.gnu.org/licenses/agpl.html
 *******************************************************************************/
package org.integratedmodelling.engine.modelling.runtime.mediators;

import java.util.ArrayList;
import java.util.List;

import org.integratedmodelling.api.knowledge.IConcept;
import org.integratedmodelling.api.modelling.IExtent;
import org.integratedmodelling.api.modelling.IObservableSemantics;
import org.integratedmodelling.api.modelling.IScale;
import org.integratedmodelling.api.modelling.IScale.Locator;
import org.integratedmodelling.api.modelling.IState;
import org.integratedmodelling.api.space.IGrid;
import org.integratedmodelling.api.space.ISpatialExtent;
import org.integratedmodelling.collections.Pair;
import org.integratedmodelling.common.space.SpaceLocator;
import org.integratedmodelling.engine.geospace.extents.Grid;
import org.integratedmodelling.exceptions.KlabUnsupportedOperationException;

public class GridToGrid extends AbstractMediator {

    private Aggregation aggregation;
    IGrid gridFrom = null;
    IGrid gridTo = null;
    private int[] subgridOffsets;

    public GridToGrid(IObservableSemantics observable, IExtent from, IExtent to,
            IConcept dataReductionTrait) {

        super(observable.getObserver(), dataReductionTrait);

        this.aggregation = MediationOperations.getAggregator(observable);
        this.gridFrom = ((ISpatialExtent) from).getGrid();
        this.gridTo = ((ISpatialExtent) to).getGrid();
        // IGeometricShape shapeto = (IGeometricShape) ((ISpatialExtent) to).getShape();
        // IGeometricShape shapefrom = (IGeometricShape) ((ISpatialExtent)
        // from).getShape();

        int[] ofs = isSubgrid(gridTo, gridFrom);
        if (ofs != null) {
            this.subgridOffsets = ofs;
        } else {
            throw new KlabUnsupportedOperationException("grid to grid mediation with resampling is still unsupported");
        }
    }

    /**
     * If to is a conformant subgrid of from, return the offsets in it. Use state left in
     * grid during subgrid generation instead of computing conformance, so only works
     * properly with the engine's Grid implementations.
     * 
     * @param gridto
     * @param gridfrom
     * @return
     */
    private int[] isSubgrid(IGrid gridto, IGrid gridfrom) {
        if (gridto instanceof Grid && gridfrom instanceof Grid) {
            if (((Grid) gridto).getParentGridId() != null
                    && ((Grid) gridto).getParentGridId().equals(((Grid)gridfrom).getSignature())) {
                return ((Grid) gridto).getOffsetInParentGrid();
            }
        }
        return null;
    }

    @Override
    public Object mediateTo(Object value, int index) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Aggregation getAggregation() {
        return aggregation;
    }


    /*
     * in this one, the index is always 0
     * (non-Javadoc)
     * @see org.integratedmodelling.api.modelling.IState.Mediator#mediateFrom(int)
     */
    @Override
    public Object mediateFrom(IState originalState, IScale.Locator... otherLocators) {
        List> ret = new ArrayList<>();
//        for (Pair zio : cellCoverage) {
//
//            /*
//             * TODO must use space locators and whatever else
//             */
//            ret.add(new Pair(zio.getFirst().getOffsetInGrid(), zio.getSecond()));
//        }
        return ret;
    }

    @Override
    public List getLocators(int index) {

        List ret = new ArrayList<>();
        if (subgridOffsets != null) {
            int[] xy = gridTo.getXYOffsets(index);
            SpaceLocator loc = SpaceLocator.get(xy[0] + subgridOffsets[0], xy[1] + subgridOffsets[1]);
            loc.setWeight(1.0);
            ret.add(loc);
        }
        return ret;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy