org.apache.giraph.examples.SimpleShortestPathsComputationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.giraph.examples.SimpleShortestPathsComputationTest.java

Source

/*
 * 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.giraph.examples;

import org.apache.giraph.conf.GiraphConfiguration;
import org.apache.giraph.edge.ByteArrayEdges;
import org.apache.giraph.edge.EdgeFactory;
import org.apache.giraph.graph.DefaultVertex;
import org.apache.giraph.graph.Vertex;
import org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat;
import org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexOutputFormat;
import org.apache.giraph.utils.InternalVertexRunner;
import org.apache.giraph.utils.MockUtils;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.LongWritable;
import org.json.JSONArray;
import org.json.JSONException;
import org.junit.Test;
import org.mockito.Mockito;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.util.Map;
import java.util.regex.Pattern;

import static org.apache.giraph.examples.SimpleShortestPathsComputation.SOURCE_ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

/**
 * Contains a simple unit test for {@link SimpleShortestPathsComputation}
 */
public class SimpleShortestPathsComputationTest {

    /**
     * Test the behavior when a shorter path to a vertex has been found
     */
    @Test
    public void testOnShorterPathFound() throws Exception {
        Vertex<LongWritable, DoubleWritable, FloatWritable> vertex = new DefaultVertex<LongWritable, DoubleWritable, FloatWritable>();
        SimpleShortestPathsComputation computation = new SimpleShortestPathsComputation();
        MockUtils.MockedEnvironment<LongWritable, DoubleWritable, FloatWritable, DoubleWritable> env = MockUtils
                .prepareVertexAndComputation(vertex, new LongWritable(7L), new DoubleWritable(Double.MAX_VALUE),
                        false, computation, 1L);
        Mockito.when(SOURCE_ID.get(env.getConfiguration())).thenReturn(2L);

        vertex.addEdge(EdgeFactory.create(new LongWritable(10L), new FloatWritable(2.5f)));
        vertex.addEdge(EdgeFactory.create(new LongWritable(20L), new FloatWritable(0.5f)));

        computation.compute(vertex, Lists.newArrayList(new DoubleWritable(2), new DoubleWritable(1.5)));

        assertTrue(vertex.isHalted());
        assertEquals(1.5d, vertex.getValue().get(), 0d);

        env.verifyMessageSent(new LongWritable(10L), new DoubleWritable(4));
        env.verifyMessageSent(new LongWritable(20L), new DoubleWritable(2));
    }

    /**
     * Test the behavior when a new, but not shorter path to a vertex has been
     * found.
     */
    @Test
    public void testOnNoShorterPathFound() throws Exception {
        Vertex<LongWritable, DoubleWritable, FloatWritable> vertex = new DefaultVertex<LongWritable, DoubleWritable, FloatWritable>();
        SimpleShortestPathsComputation computation = new SimpleShortestPathsComputation();
        MockUtils.MockedEnvironment<LongWritable, DoubleWritable, FloatWritable, DoubleWritable> env = MockUtils
                .prepareVertexAndComputation(vertex, new LongWritable(7L), new DoubleWritable(0.5), false,
                        computation, 1L);
        Mockito.when(SOURCE_ID.get(env.getConfiguration())).thenReturn(2L);

        vertex.addEdge(EdgeFactory.create(new LongWritable(10L), new FloatWritable(2.5f)));
        vertex.addEdge(EdgeFactory.create(new LongWritable(20L), new FloatWritable(0.5f)));

        computation.compute(vertex, Lists.newArrayList(new DoubleWritable(2), new DoubleWritable(1.5)));

        assertTrue(vertex.isHalted());
        assertEquals(0.5d, vertex.getValue().get(), 0d);

        env.verifyNoMessageSent();
    }

    /**
     * A local integration test on toy data
     */
    @Test
    public void testToyDataJson() throws Exception {

        // a small four vertex graph
        String[] graph = new String[] { "[1,0,[[2,1],[3,3]]]", "[2,0,[[3,1],[4,10]]]", "[3,0,[[4,2]]]",
                "[4,0,[]]" };

        GiraphConfiguration conf = new GiraphConfiguration();
        // start from vertex 1
        SOURCE_ID.set(conf, 1);
        conf.setComputationClass(SimpleShortestPathsComputation.class);
        conf.setOutEdgesClass(ByteArrayEdges.class);
        conf.setVertexInputFormatClass(JsonLongDoubleFloatDoubleVertexInputFormat.class);
        conf.setVertexOutputFormatClass(JsonLongDoubleFloatDoubleVertexOutputFormat.class);

        // run internally
        Iterable<String> results = InternalVertexRunner.run(conf, graph);

        Map<Long, Double> distances = parseDistancesJson(results);

        // verify results
        assertNotNull(distances);
        assertEquals(4, distances.size());
        assertEquals(0.0, distances.get(1L), 0d);
        assertEquals(1.0, distances.get(2L), 0d);
        assertEquals(2.0, distances.get(3L), 0d);
        assertEquals(4.0, distances.get(4L), 0d);
    }

    private Map<Long, Double> parseDistancesJson(Iterable<String> results) {
        Map<Long, Double> distances = Maps.newHashMapWithExpectedSize(Iterables.size(results));
        for (String line : results) {
            try {
                JSONArray jsonVertex = new JSONArray(line);
                distances.put(jsonVertex.getLong(0), jsonVertex.getDouble(1));
            } catch (JSONException e) {
                throw new IllegalArgumentException("Couldn't get vertex from line " + line, e);
            }
        }
        return distances;
    }

    /**
     * A local integration test on toy data
     */
    @Test
    public void testToyData() throws Exception {

        // a small four vertex graph
        String[] graph = new String[] { "1 2:1.0 3:3.0", "2 3:1.0 4:10.0", "3 4:2.0", "4" };

        GiraphConfiguration conf = new GiraphConfiguration();
        // start from vertex 1
        SOURCE_ID.set(conf, 1);
        conf.setComputationClass(SimpleShortestPathsComputation.class);
        conf.setOutEdgesClass(ByteArrayEdges.class);
        conf.setVertexInputFormatClass(LongDoubleFloatTextInputFormat.class);
        conf.setVertexOutputFormatClass(VertexWithDoubleValueNullEdgeTextOutputFormat.class);

        // run internally
        Iterable<String> results = InternalVertexRunner.run(conf, graph);

        Map<Long, Double> distances = parseDistances(results);

        // verify results
        assertNotNull(distances);
        assertEquals(4, distances.size());
        assertEquals(0.0, distances.get(1L), 0d);
        assertEquals(1.0, distances.get(2L), 0d);
        assertEquals(2.0, distances.get(3L), 0d);
        assertEquals(4.0, distances.get(4L), 0d);
    }

    private Map<Long, Double> parseDistances(Iterable<String> results) {
        Map<Long, Double> distances = Maps.newHashMapWithExpectedSize(Iterables.size(results));

        Pattern separator = Pattern.compile("[\t]");

        for (String line : results) {
            String[] tokens = separator.split(line);
            distances.put(Long.parseLong(tokens[0]), Double.parseDouble(tokens[1]));
        }
        return distances;
    }
}