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

ai.h2o.mojos.runtime.h2o3.KLimePipelineLoader Maven / Gradle / Ivy

There is a newer version: 2.8.7.1
Show newest version
package ai.h2o.mojos.runtime.h2o3;

import ai.h2o.mojos.runtime.AbstractPipelineLoader;
import ai.h2o.mojos.runtime.MojoPipeline;
import ai.h2o.mojos.runtime.MojoPipelineMeta;
import ai.h2o.mojos.runtime.MojoPipelineProtoImpl;
import ai.h2o.mojos.runtime.api.MojoColumnMeta;
import ai.h2o.mojos.runtime.api.MojoTransformMeta;
import ai.h2o.mojos.runtime.api.PipelineConfig;
import ai.h2o.mojos.runtime.api.backend.ReaderBackend;
import ai.h2o.mojos.runtime.frame.MojoColumn;
import ai.h2o.mojos.runtime.frame.MojoFrameMeta;
import ai.h2o.mojos.runtime.transforms.MojoTransform;
import ai.h2o.mojos.runtime.transforms.MojoTransformExecPipeBuilder;
import hex.genmodel.GenModel;
import hex.genmodel.MojoModel;
import hex.genmodel.MojoReaderBackend;
import hex.genmodel.easy.EasyPredictModelWrapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.joda.time.DateTime;

import static ai.h2o.mojos.runtime.h2o3.H2O3PipelineLoader.wrapModelForPrediction;

class KLimePipelineLoader extends AbstractPipelineLoader {
    private final List globalColumns;
    private final MojoTransformExecPipeBuilder root;

    public KLimePipelineLoader(ReaderBackend backend, PipelineConfig config) throws IOException {
        super(backend, config);
        final MojoReaderBackend mojoReader = new H2O3BackendAdapter(backend);
        final MojoModel model = MojoModel.load(mojoReader);
        final EasyPredictModelWrapper easyPredictModelWrapper = wrapModelForPrediction(model);

        final String name = "klime:" + model.getModelCategory().toString();
        this.globalColumns = new ArrayList<>();
        final int[] inputIndices = readInputIndices(globalColumns, model);
        final int[] outputIndices = readOutputIndices(globalColumns, model);
        final MojoFrameMeta globalMeta = new MojoFrameMeta(globalColumns);

        final MojoTransform transform = new KlimeTransform(globalMeta, inputIndices, outputIndices, easyPredictModelWrapper);
        transform.setId("klime-main");
        transform.setName(name);
        final DateTime creationTime = new DateTime(1970, 1, 1, 0, 0); //TODO
        final MojoPipelineMeta pipelineMeta = new MojoPipelineMeta(
            model.getUUID(), creationTime);
        pipelineMeta.license = "H2O-3 Opensource";
        this.root = new MojoTransformExecPipeBuilder(inputIndices, outputIndices, transform, pipelineMeta);
        this.root.transforms.add(transform);
    }

    @Override
    public List getColumns() {
        return globalColumns;
    }

    @Override
    public List getTransformations() {
        return root.metaTransforms;
    }

    @Override
    protected final MojoPipeline internalLoad() {
        return new MojoPipelineProtoImpl(globalColumns, root, PipelineConfig.DEFAULT);
    }

    static int[] readInputIndices(final List columns, final GenModel genModel) {
        final int[] inputIndices = new int[genModel.getNumCols()];
        for (int i = 0; i < genModel.getNumCols(); i += 1) {
            final String columnName = genModel.getNames()[i];
            final MojoColumn.Type columnType = (genModel.getDomainValues(i) == null) ? MojoColumn.Type.Float64 : MojoColumn.Type.Str;
            inputIndices[i] = columns.size();
            columns.add(MojoColumnMeta.create(columnName, columnType));
        }
        return inputIndices;
    }

    private static int[] readOutputIndices(final List columns, final GenModel genModel) {
        // TODO following is a bit strange exercise, let's check with MM and/or Navdeep why is that
        final List mypredictorsList = new ArrayList<>(Arrays.asList(genModel.getNames()));
        mypredictorsList.remove(genModel.getResponseName());
        final String[] predictors = mypredictorsList.toArray(new String[0]);

        final int predsSize = genModel.getPredsSize();
        final int[] outputIndices = new int[predsSize];
        outputIndices[0] = columns.size();
        columns.add(MojoColumnMeta.create(genModel.getResponseName(), MojoColumn.Type.Float64));
        outputIndices[1] = columns.size();
        columns.add(MojoColumnMeta.create("cluster", MojoColumn.Type.Float64));
        for (int i = 2; i < predsSize; i += 1) {
            outputIndices[i] = columns.size();
            final String outputColumnName = "rc_" + predictors[i - 2]; // "rc" stands for Reason Code
            columns.add(MojoColumnMeta.create(outputColumnName, MojoColumn.Type.Float64));
        }
        return outputIndices;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy