/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.horn.trainer;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Writable;

/**
 * Message wrapper for a propagating message
 */
public class PropMessage<M extends Writable, W extends Writable> implements
    Writable {

  DoubleWritable message;
  DoubleWritable weight;

  public PropMessage(DoubleWritable message, DoubleWritable weight) {
    this.message = message;
    this.weight = weight;
  }

  /**
   * @return the activation or error message
   */
  public double getMessage() {
    return message.get();
  }

  public double getInput() {
    // returns the input
    return message.get();
  }
  
  public double getDelta() {
    // returns the delta
    return message.get();
  }
  
  public double getWeight() {
    return weight.get();
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    message.readFields(in);
    weight.readFields(in);
  }

  @Override
  public void write(DataOutput out) throws IOException {
    message.write(out);
    weight.write(out);
  }

}