content: /* 
   * Copyright (C) 2015 Adrien Guille <adrien.guille@univ-lyon2.fr>
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, either version 3 of the License, or
   * (at your option) 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
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  package main.java.fr.ericlab.sondy.algo.influenceanalysis;
  
  import java.util.Collection;
  import java.util.HashSet;
  import main.java.fr.ericlab.sondy.algo.Parameter;
  import main.java.fr.ericlab.sondy.core.app.AppParameters;
  import org.graphstream.graph.Edge;
  import org.graphstream.graph.Node;
  
  /**
   *
   *   @author Adrien GUILLE, ERIC Lab, University of Lyon 2
   *   @email adrien.guille@univ-lyon2.fr
   */
  public class SocialCapitalists extends InfluenceAnalysisMethod {
      double overlapThreshold = 0.74;
      double rankScale = 10;
  
      public SocialCapitalists(){
          super();
          parameters.add(new Parameter("overlapThreshold",overlapThreshold+""));
          parameters.add(new Parameter("rankScale",rankScale+""));
      }
      
      @Override
      public String getName() {
          return "Social Capitalists";
      }
  
      @Override
      public String getCitation() {
          return "<li><b>Social Capitalists:</b> N. Dugué and A. Perez (2014) Social capitalists on Twitter: detection, evolution and behavioral analysis, Social Network Analysis and Mining, vol. 4(1) pp. 178-191</li>";
      }
  
      @Override
      public String getDescription() {
          return "Identifies users who might be social capitalists based on neighborhood comparisons";
      }
  
      @Override
      public void apply() {
          overlapThreshold = parameters.getParameterValue("overlapThreshold");
          rankScale = parameters.getParameterValue("rankScale");
          for (Node node : AppParameters.authorNetwork) {
              Collection<Edge> enteringEdgeSet = node.getEnteringEdgeSet();
              HashSet<String> A = new HashSet<>();
              for(Edge edge : enteringEdgeSet){
                  A.add(edge.getSourceNode().getId());
              }
              Collection<Edge> leavingEdgeSet = node.getLeavingEdgeSet();
              HashSet<String> B = new HashSet<>();
              double intersection = 0;
              for(Edge edge : leavingEdgeSet){
                  B.add(edge.getTargetNode().getId());
                  if(A.contains(edge.getTargetNode().getId())){
                      intersection++;
                  }
              }
              double overlap = intersection/Math.min(A.size(),B.size());
              overlap = (overlap>overlapThreshold)?overlap *rankScale:0;
              rankedUsers.add(node.getId(),(int)(overlap));
          }
      }
  
  }
  