Challenge Overview

Project Overview

Mentor ME is a responsive mobile app with the objective at assisting underachieving high school students – particularly those at risk of becoming school dropouts. Mentor ME enables, empowers and inspires new talent by building networking relationships from a list of mentors that assist you sharing ideas, guidance, learning and connecting with other leaders.

The propose of Mentor ME is be more effective, efficiency at mentorship programs and to increase the coverage of current programs where younger adults can have access to volunteer mentors to get guidance and motivation to graduate. The core of Mentor ME is the match between the Mentee interests and opportunities to Mentor Skill.

The whole project consists of three parts:
- The mentor and mentee Android application.
- A set of REST-based services to support data access and updates for the mobile applications.
- A batch Java application which will update the Haven OnDemand recommendation model with Professional and Personal Interest weightings and will use the Google Maps Geocoding API convert provided address info into Longitude and Latitude coordinates.

Competition Task Overview

In a previous service challenge, we developed an internal ranking/recommendation algorithm to allow matching between Mentors and Mentees and vice versa based purely on professional and personal interests.   In this challenge, we’re hoping to enhance this functionality.  Some Mentors and Mentee might only want to connect with their mentorship partners on a virtual basis which means that physical location won’t be a factor.  But for other physical proximity will be relevant.

In this challenge we’re also going to develop a service which provides an alternative matching mechanism using HPE’s Haven OnDemand and a script which will update the prediction model on daily basis uses the services developed.  The API’s that we’ll be using are the Train Prediction API call and the Predict API call.

Each user of the Mentor Me application will designate a series of personal and professional interests using our mobile application.  These are stored in the weighted_personal_interest and weighted_professional_interest tables of our data model.  You can find the latest data model in the Github repository in the SQL folder.  The initial list of personal and professional interests can be found here:

https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/

SQL files have been provided to load this data - personal_interest.sql and professional_interest.sql in the sqls folder of the repository.  The idea here is that common professional interest will be more important than personal interest.  The interests are ranked into two levels.  Specific interest matches should also be ranked more than highly than the general ones.  (e.g. A match on the professional interest of Television should return a higher score than a match on the more general category of Arts and Entertainment.)  Also the “weighting” of the personal and professional interests comes from the user rankings of each personal and professional interest that they select.  Each user selects a 1 - 3 ranking of both personal and professional interest - 1 being the more important interest and 3 the least important.  There is some simplified test data in the sqls/testdata.sql file which contain a script to load interest and users already.

Each day, all the personal and professional interests and their weightings for all the users in the system will need to be uploaded to the Haven OnDemand training model using the Train Prediction API call.

We’re also going to implement some Geocoding functionality as part of our batch processes.  We’re going to collect address information from our users.  You’ll need to add the following fields to the User table:

`is_virtual_user` TINYINT(1) NOT NULL,
`street_address` VARCHAR (512)
`city` VARCHAR(128)
`state_id` BIGINT (fk to state)
`country_id` BIGINT (fk to country)
`postal_code` VARCHAR(25)
`longitude` DECIMAL (16, 8)
`latitude` DECIMAL (16, 8)
`last_modified_on` DATETIME NOT NULL (this can be initialized with the created_on date to start)

We need to modify our “Auditable Interface”.  Currently we only have a created_on date in our Auditable interface.  But I think we need to include a “last_modified_on” field as well for some of the logic for processing users.   Specifically, we need to update the last_modified_on date if there have been changes to a user so the batch process can ensure that the users preference and location have been updated for matching purposes.  A country.sql file and state.sql file have been provided in the sqls folder of the services repository.

Java Batch Application Requirements:
1. Create a java command line application that can be executed by shell script on a Linux machine on a nightly basis using cron.
2. The java application will extract user details and preferences for users that have been newly created or updated in the past 24 hours.  Please update our User services/endpoints to include the new information required to extract the appropriate list of users and their info.
3. The application will use the Google Maps Geocoding API to convert provided address info into Longitude  and Latitude Coordinates.
4. We have a limited number of API calls per night.  If we can batch a set of addresses and receive a batch of geocoded responses for the Longitude and Latitude updates this is ideal.
5. We should delete the currently trained model in the system.
6. Create and Train a model to predict matching mentors based on professional and personal interests using the Haven On Demand Train Prediction API. It’s going to require a little thought to handle the weightings properly. Here is an article about how to set up the models.  I think we’re going to need to send both the parent categories (level 1) and the more specific (level 2) categories to make matching more likely since our list of lower level personal interest is 361 individual categories.  If another API call is more likely to fulfill the matching requirements, alternative solutions can be discussed in the forums.
7. You should also load whether a User is a Mentor or Mentee to the model or perhaps we create two separate models for matching purposes.
8. When the application has trained the model it should execute asynchronous job status calls to validate that the model has been trained.  It should output a success or failure message to a log file.
9. It would be helpful as well to execute a Get Prediction Model Details after training and logs results to provide some details about the training process.
10. The batch java command line application should be in a separate directory.  We’ll probably load this code to a separate repository.
11. Please use Maven to build a jar file for the application.
12. Environment specific variable like the IP addresses for the endpoints should be designated in system variables.

Services Update Requirements
1. Add the User field defined above to the User table and the User Service output.
2. Update the Auditable interface so that we can report on a Last Modified Timestamp as well as the Created Date Timestamp
3. Create a services endpoint on each of the Mentor and Mentee Services which executes a Predict call to the model you’ve trained with Haven OnDemand.  This can be synchronous API call.  The idea here is to retrieve a list of Mentors or Mentee with compatible interests.

Technology Overview
Java 8
Haven OnDemand
REST
MySQL



Final Submission Guidelines

Submission Deliverables

- For each member, the final submission should be uploaded via the challenge detail page on topcoder.com.
- You should use the code in the following GitHub repository as a starting point for your submission: https://github.com/topcoderinc/HPE-LP-MentorMe-Services. You should fork this repository.  Winning submissions will be asked to submit a pull request to the repository.
- Please use the existing build scripts to build and deploy your solutions.  You, of course, may make modifications to them as required.

REVIEW STYLE:

Final Review:

Community Review Board

Approval:

User Sign-Off

SHARE:

ID: 30055559