Package br.edu.utfpr.cm.JGitMinerWeb.services.matrix.auxiliary

Examples of br.edu.utfpr.cm.JGitMinerWeb.services.matrix.auxiliary.AuxFileFile


                EntityCommitFile file1 = commitFiles.get(i);
                for (int j = i + 1; j < commitFiles.size(); j++) {
                    EntityCommitFile file2 = commitFiles.get(j);
                    if (!file1.equals(file2)
                            && !Util.stringEquals(file1.getFilename(), file2.getFilename())) {
                        tempResultFiles.add(new AuxFileFile(file1.getFilename(), file2.getFilename()));
                    }
                }
            }
            commitFiles.clear();
View Full Code Here


        Map<String, AuxFileFile> edgeFiles = new HashMap<>();
        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);
           
            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);
           
            // to count unique developers
            distinctDevelopers.add(pairUser.getUser());
            distinctDevelopers.add(pairUser.getUser2());
           
            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(pairUser.getUser());
                commiters.add(pairUser.getUser2());
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(pairUser.getUser());
                commiters.add(pairUser.getUser2());
                commitersPairFile.put(pairFile, commiters);
            }
           
            String edgeName = pairUser.toString();
           
            // to count unique files
            distinctFiles.add(pairFile.getFileName());
            distinctFiles.add(pairFile.getFileName2());
           
            pairFiles.add(pairFile);
            edgeFiles.put(edgeName, pairFile);
           
            String weightedEdge = (String) params.get("weightedEdge");
            if ("false".equalsIgnoreCase(weightedEdge)) {
                // binary edge weight
                edgeWeigth.put(edgeName, 1);
            } else {
                /* Sum commit for each pair file that the pair dev has commited. */
                if (edgeWeigth.containsKey(pairUser.toStringUserAndUser2())) {
                    // edgeName = user + user2
                    edgeWeigth.put(pairUser.toStringUserAndUser2(), edgeWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
                } else if (edgeWeigth.containsKey(pairUser.toStringUser2AndUser())) {
                    // edgeName = user2 + user
                    edgeWeigth.put(pairUser.toStringUser2AndUser(), edgeWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
                } else {
                    edgeWeigth.put(edgeName, Integer.valueOf(columns[4]));
                }
            }
           
            if (!pairFileCommitCount.containsKey(pairFile)) {
                pairFileCommitCount.put(pairFile,
                        calculeSumUpdatesOfTwoFile(pairFile.getFileName(), pairFile.getFileName2(), beginDate, endDate));
            }
           
            /**
             * The co-change network is constructed as follow:
             * If developer A and developer B commits a pair file PF, then they are connected in network.
             */
            if (!graph.containsVertex(pairUser.getUser())
                    || !graph.containsVertex(pairUser.getUser2())
                    || !graph.isNeighbor(pairUser.getUser(), pairUser.getUser2())) {
                graph.addEdge(edgeName, pairUser.getUser(), pairUser.getUser2(), EdgeType.UNDIRECTED);
            }
        }
        out.printLog("Weigth of edges:");
        for (Map.Entry<String, Integer> entry : edgeWeigth.entrySet()) {
            out.printLog(entry.getKey() + " " + entry.getValue());
        }
        out.printLog("End of weigth of edges.");

        /**
         * Calculates structural holes metrics for each developer on the co-change network based.
         */
        Map<String, StructuralHolesMeasure<String>> metricsResult =
                StructuralHolesCalculator.calcule(graph, edgeWeigth);
       
        /**
         * For each pair of file, calculate the sum, average, and max of each
         * structural holes metrics of developer that commited the pair of file.
         */
        List<AuxFileFileMetrics> structuralHolesMetrics = new ArrayList<>(pairFiles.size());
        for (AuxFileFile pairFile : pairFiles) {
            double efficiencyMax = 0, efficiencyAvg, efficiencySum = 0;
            double effectiveSizeMax = 0, effectiveSizeAvg, effectiveSizeSum = 0;
            double constraintMax = 0, constraintAvg, constraintSum = 0;
            double hierarchyMax = 0, hierarchyAvg, hierarchySum = 0;
            long developers = 0;
            for (String commiter : commitersPairFile.get(pairFile)) {
                StructuralHolesMeasure<String> commiterMetric = metricsResult.get(commiter);
                double efficiency = commiterMetric.getEfficiency();
                double effectiveSize = commiterMetric.getEffectiveSize();
                double constraint = commiterMetric.getConstraint();
                double hierarchy = commiterMetric.getHierarchy();
               
                efficiencySum += efficiency;
                effectiveSizeSum += effectiveSize;
                constraintSum += constraint;
                hierarchySum += hierarchy;
               
                efficiencyMax = Math.max(efficiencyMax, efficiency);
                effectiveSizeMax = Math.max(effectiveSizeMax, effectiveSize);
                constraintMax = Math.max(constraintMax, constraint);
                hierarchyMax = Math.max(hierarchyMax, hierarchy);
               
                developers++;
            }
            efficiencyAvg = efficiencySum / developers;
            effectiveSizeAvg = effectiveSizeSum / developers;
            constraintAvg = constraintSum / developers;
            hierarchyAvg = hierarchySum / developers;
           
            Long updates =
                    calculeUpdates(pairFile.getFileName(), pairFile.getFileName2(),
                            beginDate, endDate);
            Long futureUpdates =
                    calculeUpdates(pairFile.getFileName(), pairFile.getFileName2(),
                            futureBeginDate, futureEndDate);
           
            structuralHolesMetrics.add(
                    new AuxFileFileMetrics(
                        pairFile.getFileName(), pairFile.getFileName2(),
                        efficiencySum, efficiencyAvg, efficiencyMax,
                        effectiveSizeSum, effectiveSizeAvg, effectiveSizeMax,
                        constraintSum, constraintAvg, constraintMax,
                        hierarchySum, hierarchyAvg, hierarchyMax,
                        developers, pairFileCommitCount.get(pairFile), updates, futureUpdates));
View Full Code Here

        // construindo a rede de comunicação para cada par de arquivo (desenvolvedores que comentaram)
        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
           
            // ignora %README%, %Rakefile, %CHANGELOG%, %Gemfile%, %.gitignore
            if (isIgnored(pairFile.getFileName())
                    || isIgnored(pairFile.getFileName2())) {
                countIgnored++;
                continue;
            }
           
            Long pairFileNumberOfPullrequestOfPairFuture;
            if (futurePullRequest.containsKey(pairFile)) {
                pairFileNumberOfPullrequestOfPairFuture = futurePullRequest.get(pairFile);
            } else {
                pairFileNumberOfPullrequestOfPairFuture = pairFileDAO
                    .calculeNumberOfPullRequest(repository,
                            pairFile.getFileName(), pairFile.getFileName2(),
                            futureBeginNumber, futureEndNumber, true);
                futurePullRequest.put(pairFile, pairFileNumberOfPullrequestOfPairFuture);
            }
           
//            Double supportPairFile = numberOfAllPullrequestFuture == 0 ? 0d :
//                    pairFileNumberOfPullrequestOfPairFuture.doubleValue() /
//                    numberOfAllPullrequestFuture.doubleValue();
           
           
            // minimum support is 0.01, ignore file if lower than this (0.01)
//            if (supportPairFile < Double.valueOf(0.01d)) {
            if (pairFileNumberOfPullrequestOfPairFuture < 2) {
//                out.printLog("Ignoring " + pairFile + ": future pull requests " + pairFileNumberOfPullrequestOfPairFuture);
                countIgnored++;
                continue;
            }
           
            String commiter1 = columns[0];
            String commiter2 = columns[3];
           
            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(commiter1);
                commiters.add(commiter2);
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(commiter1);
                commiters.add(commiter2);
                commitersPairFile.put(pairFile, commiters);
            }

            // adiciona conforme o peso
            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);
//           
//            /* Sum commit for each pair file that the pair dev has commited. */
//            // user > user2 - directed
//            if (edgesWeigth.containsKey(pairUser.toStringUserAndUser2())) {
//                // edgeName = user + user2
//                edgesWeigth.put(pairUser.toStringUserAndUser2(), edgesWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
////            } else if (edgesWeigth.containsKey(pairUser.toStringUser2AndUser())) {
////                // edgeName = user2 + user
////                edgesWeigth.put(pairUser.toStringUser2AndUser(), edgesWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
//            } else {
                edgesWeigth.put(edgeName, Integer.valueOf(columns[4]));
//            }
           
//            if (!graph.containsVertex(pairUser.getUser())
//                    || !graph.containsVertex(pairUser.getUser2())
//                    || !graph.isNeighbor(pairUser.getUser(), pairUser.getUser2())) {
                graph.addEdge(edgeName, pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
//            }
               
            // check if network already created
            if (pairFileNetwork.containsKey(pairFile)) {
                pairFileNetwork.get(pairFile)
                        .addEdge(edgeName, commiter1, commiter2, EdgeType.DIRECTED);
            } else {
                DirectedSparseMultigraph<String, String> graphMulti =
                        new DirectedSparseMultigraph<>();
                graphMulti.addEdge(edgeName, commiter1, commiter2, EdgeType.DIRECTED);
                pairFileNetwork.put(pairFile, graphMulti);
            }
        }
//        JungExport.exportToImage(graph, "C:/Users/a562273/Desktop/networks/",
//                beginNumber + " a " + endNumber);
       
        out.printLog("Número de pares de arquivos ignoradoa: " + countIgnored);
       
//        int size = commitersPairFile.size();
//        int i = 0;
        out.printLog("Número de autores de comentários (commenters): " + graph.getVertexCount());
        out.printLog("Número de pares de arquivos: " + commitersPairFile.size());
        out.printLog("Iniciando cálculo das metricas.");

        Set<AuxFileFileMetrics> fileFileMetrics = new HashSet<>();
       
        out.printLog("Calculando metricas SNA...");

        GlobalMeasure global = GlobalMeasureCalculator.calcule(graph);
        out.printLog("Global measures: " + global.toString());
//        Map<String, Double> barycenter = BarycenterCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> betweenness = BetweennessCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> closeness = ClosenessCalculator.calcule(graph, edgesWeigth);
        Map<String, Integer> degree = DegreeCalculator.calcule(graph);
        Map<String, Double> eigenvector = EigenvectorCalculator.calcule(graph, edgesWeigth);
        Map<String, EgoMeasure<String>> ego = EgoMeasureCalculator.calcule(graph, edgesWeigth);
        Map<String, StructuralHolesMeasure<String>> structuralHoles = StructuralHolesCalculator.calcule(graph, edgesWeigth);

        out.printLog("Calculando somas, máximas, médias, updates e code churn para cada par de arquivos...");
        for (Map.Entry<AuxFileFile, Set<String>> entry : commitersPairFile.entrySet()) {
//            System.out.println(++i + "/" + size);
            AuxFileFile fileFile = entry.getKey();
            Set<String> devs = entry.getValue();
           
            // pair file network
            GlobalMeasure pairFileGlobal = GlobalMeasureCalculator.calcule(pairFileNetwork.get(fileFile));
           
//            Double barycenterSum = 0d, barycenterAvg, barycenterMax = Double.NEGATIVE_INFINITY;
            Double betweennessSum = 0d, betweennessAvg, betweennessMax = Double.NEGATIVE_INFINITY;
            Double closenessSum = 0d, closenessAvg, closenessMax = Double.NEGATIVE_INFINITY;
            Integer degreeSum = 0, degreeMax = Integer.MIN_VALUE;
            Double degreeAvg;
            Double eigenvectorSum = 0d, eigenvectorAvg, eigenvectorMax = Double.NEGATIVE_INFINITY;

            Double egoBetweennessSum = 0d, egoBetweennessAvg, egoBetweennessMax = Double.NEGATIVE_INFINITY;
            Long egoSizeSum = 0l, egoSizeMax = Long.MIN_VALUE;
//            Long egoPairsSum = 0l, egoPairsMax = Long.MIN_VALUE;
            Long egoTiesSum = 0l, egoTiesMax = Long.MIN_VALUE;
            Double egoSizeAvg, /*egoPairsAvg,*/ egoTiesAvg;
            Double egoDensitySum = 0d, egoDensityAvg, egoDensityMax = Double.NEGATIVE_INFINITY;

            Double efficiencySum = 0.0d, efficiencyAvg, efficiencyMax = Double.NEGATIVE_INFINITY;
            Double effectiveSizeSum = 0.0d, effectiveSizeAvg, effectiveSizeMax = Double.NEGATIVE_INFINITY;
            Double constraintSum = 0.0d, constraintAvg, constraintMax = Double.NEGATIVE_INFINITY;
            Double hierarchySum = 0.0d, hierarchyAvg, hierarchyMax = Double.NEGATIVE_INFINITY;

            for (String dev : devs) {
                // sums calculation
//                barycenterSum += barycenter.get(dev);
                betweennessSum += betweenness.get(dev);
                closenessSum += Double.isInfinite(closeness.get(dev)) ? 0 : closeness.get(dev);
                degreeSum += degree.get(dev);
                eigenvectorSum += eigenvector.get(dev);

                egoBetweennessSum += ego.get(dev).getBetweennessCentrality();
                egoSizeSum += ego.get(dev).getSize();
//                egoPairsSum += ego.get(dev).getPairs();
                egoTiesSum += ego.get(dev).getTies();
                egoDensitySum += ego.get(dev).getDensity();

                efficiencySum += structuralHoles.get(dev).getEfficiency();
                effectiveSizeSum += structuralHoles.get(dev).getEffectiveSize();
                constraintSum += structuralHoles.get(dev).getConstraint();
                hierarchySum += structuralHoles.get(dev).getHierarchy();

                // maximum calculation
//                barycenterMax = Math.max(barycenterMax, barycenter.get(dev));
                betweennessMax = Math.max(betweennessMax, betweenness.get(dev));
                closenessMax = Math.max(closenessMax, closeness.get(dev));
                degreeMax = Math.max(degreeMax, degree.get(dev));
                eigenvectorMax = Math.max(eigenvectorMax, eigenvector.get(dev));

                egoBetweennessMax = Math.max(egoBetweennessMax, ego.get(dev).getBetweennessCentrality());
                egoSizeMax = Math.max(egoSizeMax, ego.get(dev).getSize());
//                egoPairsMax = Math.max(egoPairsMax, ego.get(dev).getPairs());
                egoTiesMax = Math.max(egoTiesMax, ego.get(dev).getTies());
                egoDensityMax = Math.max(egoDensityMax, ego.get(dev).getDensity());

                efficiencyMax = Math.max(efficiencyMax, structuralHoles.get(dev).getEfficiency());
                effectiveSizeMax = Math.max(effectiveSizeMax, structuralHoles.get(dev).getEffectiveSize());
                constraintMax = Math.max(constraintMax, structuralHoles.get(dev).getConstraint());
                hierarchyMax = Math.max(hierarchyMax, structuralHoles.get(dev).getHierarchy());
            }

            // average calculation
            double distinctCommentersCount = devs.size();
//                barycenterAvg = barycenterSum / (double) distinctCommentersCount;
            betweennessAvg = betweennessSum / (double) distinctCommentersCount;
            closenessAvg = closenessSum / (double) distinctCommentersCount;
            degreeAvg = degreeSum / (double) distinctCommentersCount;
            eigenvectorAvg = eigenvectorSum / (double) distinctCommentersCount;

            egoBetweennessAvg = egoBetweennessSum / (double) distinctCommentersCount;
            egoSizeAvg = egoSizeSum / (double) distinctCommentersCount;
//            egoPairsAvg = egoPairsSum / (double) distinctCommentersCount;
            egoTiesAvg = egoTiesSum / (double) distinctCommentersCount;
            egoDensityAvg = egoDensitySum / (double) distinctCommentersCount;

            efficiencyAvg = efficiencySum / (double) distinctCommentersCount;
            effectiveSizeAvg = effectiveSizeSum / (double) distinctCommentersCount;
            constraintAvg = constraintSum / (double) distinctCommentersCount;
            hierarchyAvg = hierarchySum / (double) distinctCommentersCount;

            Long updates = pairFileDAO.calculeNumberOfPullRequest(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber, true);

            Long futureUpdates = pairFileDAO.calculeNumberOfPullRequest(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    futureBeginNumber, futureEndNumber, true);

            Long commentsSum = pairFileDAO.calculeComments(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber, true);

            Long codeChurn = pairFileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber);
            Long codeChurn2 = pairFileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName2(), fileFile.getFileName(),
                    beginNumber, endNumber);

            double codeChurnAvg = (codeChurn + codeChurn2) / 2.0d;

            AuxFileFileMetrics auxFileFileMetrics = new AuxFileFileMetrics(
                    fileFile.getFileName(), fileFile.getFileName2(),
//                        barycenterSum, barycenterAvg, barycenterMax,
                    betweennessSum, betweennessAvg, betweennessMax,
                    closenessSum, closenessAvg, closenessMax,
                    degreeSum, degreeAvg, degreeMax,
                    eigenvectorSum, eigenvectorAvg, eigenvectorMax,
View Full Code Here

        // construindo a rede de comunicação para cada par de arquivo (desenvolvedores que comentaram)
        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
           
            // ignora %README%, %Rakefile, %CHANGELOG%, %Gemfile%, %.gitignore
            if (isIgnored(pairFile.getFileName())
                    || isIgnored(pairFile.getFileName2())) {
                countIgnored++;
                continue;
            }
           
            Long pairFileNumberOfPullrequestOfPairFuture;
            if (futurePullRequest.containsKey(pairFile)) {
                pairFileNumberOfPullrequestOfPairFuture = futurePullRequest.get(pairFile);
            } else {
                pairFileNumberOfPullrequestOfPairFuture = pairFileDAO
                    .calculeNumberOfPullRequest(repository,
                            pairFile.getFileName(), pairFile.getFileName2(),
                            futureBeginNumber, futureEndNumber, true);
                futurePullRequest.put(pairFile, pairFileNumberOfPullrequestOfPairFuture);
            }
           
//            Double supportPairFile = numberOfAllPullrequestFuture == 0 ? 0d :
//                    pairFileNumberOfPullrequestOfPairFuture.doubleValue() /
//                    numberOfAllPullrequestFuture.doubleValue();
           
           
            // minimum support is 0.01, ignore file if lower than this (0.01)
//            if (supportPairFile < Double.valueOf(0.01d)) {
            if (pairFileNumberOfPullrequestOfPairFuture < 2) {
//                out.printLog("Ignoring " + pairFile + ": future pull requests " + pairFileNumberOfPullrequestOfPairFuture);
                countIgnored++;
                continue;
            }
           
            String commiter1 = columns[0];
            String commiter2 = columns[3];
           
            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(commiter1);
                commiters.add(commiter2);
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(commiter1);
                commiters.add(commiter2);
                commitersPairFile.put(pairFile, commiters);
            }

            // adiciona conforme o peso
//            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);
           
            /* Sum commit for each pair file that the pair dev has commited. */
            // user > user2 - directed edge
            if (edgesWeigth.containsKey(pairUser.toStringUserAndUser2())) {
                // edgeName = user + user2
                edgesWeigth.put(pairUser.toStringUserAndUser2(), edgesWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
//           
//            } else if (edgesWeigth.containsKey(pairUser.toStringUser2AndUser())) {
//                // edgeName = user2 + user - undirected edge
//                edgesWeigth.put(pairUser.toStringUser2AndUser(), edgesWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
            } else {
                edgesWeigth.put(pairUser.toStringUserAndUser2(), Integer.valueOf(columns[4]));
            }
           
            if (!graph.containsVertex(pairUser.getUser())
                    || !graph.containsVertex(pairUser.getUser2())
                    || !graph.isNeighbor(pairUser.getUser(), pairUser.getUser2())) {
                graph.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            }
               
            // check if network already created
            if (pairFileNetwork.containsKey(pairFile)) {
                pairFileNetwork.get(pairFile)
                        .addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            } else {
                DirectedSparseGraph<String, String> graphMulti =
                        new DirectedSparseGraph<>();
                graphMulti.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
                pairFileNetwork.put(pairFile, graphMulti);
            }
        }
//        JungExport.exportToImage(graph, "C:/Users/a562273/Desktop/networks/",
//                beginNumber + " a " + endNumber);
       
        out.printLog("Número de pares de arquivos ignoradoa: " + countIgnored);
       
//        int size = commitersPairFile.size();
//        int i = 0;
        out.printLog("Número de autores de comentários (commenters): " + graph.getVertexCount());
        out.printLog("Número de pares de arquivos: " + commitersPairFile.size());
        out.printLog("Iniciando cálculo das metricas.");

        Set<AuxFileFileMetrics> fileFileMetrics = new HashSet<>();
       
        out.printLog("Calculando metricas SNA...");

        GlobalMeasure global = GlobalMeasureCalculator.calcule(graph);
        out.printLog("Global measures: " + global.toString());
//        Map<String, Double> barycenter = BarycenterCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> betweenness = BetweennessCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> closeness = ClosenessCalculator.calcule(graph, edgesWeigth);
        Map<String, Integer> degree = DegreeCalculator.calcule(graph);
        Map<String, Double> eigenvector = EigenvectorCalculator.calcule(graph, edgesWeigth);
        Map<String, EgoMeasure<String>> ego = EgoMeasureCalculator.calcule(graph, edgesWeigth);
        Map<String, StructuralHolesMeasure<String>> structuralHoles = StructuralHolesCalculator.calcule(graph, edgesWeigth);

        out.printLog("Calculando somas, máximas, médias, updates e code churn para cada par de arquivos...");
        for (Map.Entry<AuxFileFile, Set<String>> entry : commitersPairFile.entrySet()) {
//            System.out.println(++i + "/" + size);
            AuxFileFile fileFile = entry.getKey();
            Set<String> devs = entry.getValue();
           
            // pair file network
            GlobalMeasure pairFileGlobal = GlobalMeasureCalculator.calcule(pairFileNetwork.get(fileFile));
           
//            Double barycenterSum = 0d, barycenterAvg, barycenterMax = Double.NEGATIVE_INFINITY;
            Double betweennessSum = 0d, betweennessAvg, betweennessMax = Double.NEGATIVE_INFINITY;
            Double closenessSum = 0d, closenessAvg, closenessMax = Double.NEGATIVE_INFINITY;
            Integer degreeSum = 0, degreeMax = Integer.MIN_VALUE;
            Double degreeAvg;
            Double eigenvectorSum = 0d, eigenvectorAvg, eigenvectorMax = Double.NEGATIVE_INFINITY;

            Double egoBetweennessSum = 0d, egoBetweennessAvg, egoBetweennessMax = Double.NEGATIVE_INFINITY;
            Long egoSizeSum = 0l, egoSizeMax = Long.MIN_VALUE;
//            Long egoPairsSum = 0l, egoPairsMax = Long.MIN_VALUE;
            Long egoTiesSum = 0l, egoTiesMax = Long.MIN_VALUE;
            Double egoSizeAvg, /*egoPairsAvg,*/ egoTiesAvg;
            Double egoDensitySum = 0d, egoDensityAvg, egoDensityMax = Double.NEGATIVE_INFINITY;

            Double efficiencySum = 0.0d, efficiencyAvg, efficiencyMax = Double.NEGATIVE_INFINITY;
            Double effectiveSizeSum = 0.0d, effectiveSizeAvg, effectiveSizeMax = Double.NEGATIVE_INFINITY;
            Double constraintSum = 0.0d, constraintAvg, constraintMax = Double.NEGATIVE_INFINITY;
            Double hierarchySum = 0.0d, hierarchyAvg, hierarchyMax = Double.NEGATIVE_INFINITY;

            for (String dev : devs) {
                // sums calculation
//                barycenterSum += barycenter.get(dev);
                betweennessSum += betweenness.get(dev);
                closenessSum += Double.isInfinite(closeness.get(dev)) ? 0 : closeness.get(dev);
                degreeSum += degree.get(dev);
                eigenvectorSum += eigenvector.get(dev);

                egoBetweennessSum += ego.get(dev).getBetweennessCentrality();
                egoSizeSum += ego.get(dev).getSize();
//                egoPairsSum += ego.get(dev).getPairs();
                egoTiesSum += ego.get(dev).getTies();
                egoDensitySum += ego.get(dev).getDensity();

                efficiencySum += structuralHoles.get(dev).getEfficiency();
                effectiveSizeSum += structuralHoles.get(dev).getEffectiveSize();
                constraintSum += structuralHoles.get(dev).getConstraint();
                hierarchySum += structuralHoles.get(dev).getHierarchy();

                // maximum calculation
//                barycenterMax = Math.max(barycenterMax, barycenter.get(dev));
                betweennessMax = Math.max(betweennessMax, betweenness.get(dev));
                closenessMax = Math.max(closenessMax, closeness.get(dev));
                degreeMax = Math.max(degreeMax, degree.get(dev));
                eigenvectorMax = Math.max(eigenvectorMax, eigenvector.get(dev));

                egoBetweennessMax = Math.max(egoBetweennessMax, ego.get(dev).getBetweennessCentrality());
                egoSizeMax = Math.max(egoSizeMax, ego.get(dev).getSize());
//                egoPairsMax = Math.max(egoPairsMax, ego.get(dev).getPairs());
                egoTiesMax = Math.max(egoTiesMax, ego.get(dev).getTies());
                egoDensityMax = Math.max(egoDensityMax, ego.get(dev).getDensity());

                efficiencyMax = Math.max(efficiencyMax, structuralHoles.get(dev).getEfficiency());
                effectiveSizeMax = Math.max(effectiveSizeMax, structuralHoles.get(dev).getEffectiveSize());
                constraintMax = Math.max(constraintMax, structuralHoles.get(dev).getConstraint());
                hierarchyMax = Math.max(hierarchyMax, structuralHoles.get(dev).getHierarchy());
            }

            // average calculation
            double distinctCommentersCount = devs.size();
//                barycenterAvg = barycenterSum / (double) distinctCommentersCount;
            betweennessAvg = betweennessSum / (double) distinctCommentersCount;
            closenessAvg = closenessSum / (double) distinctCommentersCount;
            degreeAvg = degreeSum / (double) distinctCommentersCount;
            eigenvectorAvg = eigenvectorSum / (double) distinctCommentersCount;

            egoBetweennessAvg = egoBetweennessSum / (double) distinctCommentersCount;
            egoSizeAvg = egoSizeSum / (double) distinctCommentersCount;
//            egoPairsAvg = egoPairsSum / (double) distinctCommentersCount;
            egoTiesAvg = egoTiesSum / (double) distinctCommentersCount;
            egoDensityAvg = egoDensitySum / (double) distinctCommentersCount;

            efficiencyAvg = efficiencySum / (double) distinctCommentersCount;
            effectiveSizeAvg = effectiveSizeSum / (double) distinctCommentersCount;
            constraintAvg = constraintSum / (double) distinctCommentersCount;
            hierarchyAvg = hierarchySum / (double) distinctCommentersCount;

            Long updates = pairFileDAO.calculeNumberOfPullRequest(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber, true);

            Long futureUpdates = pairFileDAO.calculeNumberOfPullRequest(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    futureBeginNumber, futureEndNumber, true);

            Long commentsSum = pairFileDAO.calculeComments(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber, true);

            Long codeChurn = pairFileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginNumber, endNumber);
            Long codeChurn2 = pairFileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName2(), fileFile.getFileName(),
                    beginNumber, endNumber);

            double codeChurnAvg = (codeChurn + codeChurn2) / 2.0d;

            AuxFileFileMetrics auxFileFileMetrics = new AuxFileFileMetrics(
                    fileFile.getFileName(), fileFile.getFileName2(),
//                        barycenterSum, barycenterAvg, barycenterMax,
                    betweennessSum, betweennessAvg, betweennessMax,
                    closenessSum, closenessAvg, closenessMax,
                    degreeSum, degreeAvg, degreeMax,
                    eigenvectorSum, eigenvectorAvg, eigenvectorMax,
View Full Code Here

        Map<String, AuxFileFile> edgeFiles = new HashMap<>();
        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);

            // to count unique developers
            distinctDevelopers.add(pairUser.getUser());
            distinctDevelopers.add(pairUser.getUser2());

            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(pairUser.getUser());
                commiters.add(pairUser.getUser2());
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(pairUser.getUser());
                commiters.add(pairUser.getUser2());
                commitersPairFile.put(pairFile, commiters);
            }

            String edgeName = pairUser.toString();

            // to count unique files
            distinctFiles.add(pairFile.getFileName());
            distinctFiles.add(pairFile.getFileName2());

            pairFiles.add(pairFile);
            edgeFiles.put(edgeName, pairFile);

            String weightedEdge = (String) params.get("weightedEdge");
            if ("false".equalsIgnoreCase(weightedEdge)) {
                // binary edge weight
                edgeWeigth.put(edgeName, 1);
            } else {
                /* Sum commit for each pair file that the pair dev has commited. */
                if (edgeWeigth.containsKey(pairUser.toStringUserAndUser2())) {
                    // edgeName = user + user2
                    edgeWeigth.put(pairUser.toStringUserAndUser2(), edgeWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
                } else if (edgeWeigth.containsKey(pairUser.toStringUser2AndUser())) {
                    // edgeName = user2 + user
                    edgeWeigth.put(pairUser.toStringUser2AndUser(), edgeWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
                } else {
                    edgeWeigth.put(edgeName, Integer.valueOf(columns[4]));
                }
            }

            if (!pairFileCommitCount.containsKey(pairFile)) {
                pairFileCommitCount.put(pairFile,
                        pairFileDAO.calculeSumUpdatesOfTwoFile( repository,
                                pairFile.getFileName(), pairFile.getFileName2(),
                                beginDate, endDate));
            }

            /**
             * The co-change network is constructed as follow: If developer A
             * and developer B commits a pair file PF, then they are connected
             * in network.
             */
            if (!graph.containsVertex(pairUser.getUser())
                    || !graph.containsVertex(pairUser.getUser2())
                    || !graph.isNeighbor(pairUser.getUser(), pairUser.getUser2())) {
                graph.addEdge(edgeName, pairUser.getUser(), pairUser.getUser2(), EdgeType.UNDIRECTED);
            }
        }
        out.printLog("Weigth of edges:");
        for (Map.Entry<String, Integer> entry : edgeWeigth.entrySet()) {
            out.printLog(entry.getKey() + " " + entry.getValue());
        }
        out.printLog("End of weigth of edges.");

        /**
         * Calculates structural holes metrics for each developer on the
         * co-change network based.
         */
        Map<String, EgoMeasure<String>> metricsResult = EgoMeasureCalculator.calcule(graph);

        /**
         * For each pair of file, calculate the sum, average, and max of each
         * structural holes metrics of developer that commited the pair of file.
         */
        List<AuxFileFileMetrics> egoMetrics = new ArrayList<>(pairFiles.size());
        for (AuxFileFile pairFile : pairFiles) {
            long sizeMax = 0, sizeSum = 0;
            long pairsMax = 0, pairsSum = 0;
            long tiesMax = 0, tiesSum = 0;
            double sizeAvg, pairsAvg, tiesAvg;
            double densityMax = 0, densityAvg, densitySum = 0;
            double betweennessMax = 0, betweennessAvg, betweennessSum = 0;
            long developers = 0;
            for (String commiter : commitersPairFile.get(pairFile)) {
                EgoMeasure<String> commiterMetric = metricsResult.get(commiter);
                long size = commiterMetric.getSize();
                long pairs = commiterMetric.getPairs();
                long ties = commiterMetric.getTies();
                double density = commiterMetric.getDensity();
                double betweenness = commiterMetric.getBetweennessCentrality();

                sizeSum += size;
                pairsSum += pairs;
                tiesSum += ties;
                densitySum += density;
                betweennessSum += betweenness;

                sizeMax = Math.max(sizeMax, size);
                pairsMax = Math.max(pairsMax, pairs);
                tiesMax = Math.max(tiesMax, ties);
                densityMax = Math.max(densityMax, density);
                betweennessMax = Math.max(betweennessMax, betweenness);

                developers++;
            }
            sizeAvg = (double) sizeSum / (double) developers;
            tiesAvg = (double) tiesSum / (double) developers;
            pairsAvg = (double) pairsSum / (double) developers;
            densityAvg = densitySum / developers;
            betweennessAvg = betweennessSum / developers;

            Long updates = pairFileDAO.calculeUpdates(repository,
                            pairFile.getFileName(), pairFile.getFileName2(),
                            beginDate, endDate);
            Long futureUpdates = pairFileDAO.calculeUpdates(repository,
                            pairFile.getFileName(), pairFile.getFileName2(),
                            futureBeginDate, futureEndDate);

            egoMetrics.add(
                    new AuxFileFileMetrics(
                            pairFile.getFileName(), pairFile.getFileName2(),
                            sizeSum, sizeAvg, sizeMax,
                            pairsSum, pairsAvg, pairsMax,
                            tiesSum, tiesAvg, tiesMax,
                            densitySum, densityAvg, densityMax,
                            betweennessSum, betweennessAvg, betweennessMax,
View Full Code Here

        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
            pairFiles.add(pairFile);

            String commiter1 = columns[0];
            String commiter2 = columns[3];

            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(commiter1);
                commiters.add(commiter2);
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(commiter1);
                commiters.add(commiter2);
                commitersPairFile.put(pairFile, commiters);
            }

            // adiciona conforme o peso
            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            edgesWeigth.put(edgeName, Util.stringToInteger(columns[4]));

            graphMulti.addEdge(edgeName, commiter1, commiter2, type);
        }

        Transformer trans = createWeigthTransformer(graphMulti, edgesWeigth);

        BetweennessCentrality<String, String> btwGen = new BetweennessCentrality<>(graphMulti, trans);
        ClosenessCentrality<String, String> clsGen = new ClosenessCentrality<>(graphMulti, trans);
        DegreeScorer<String> dgrGen = new DegreeScorer<>(graphMulti);

        Map<String, AuxUserMetrics> usersMetrics = new HashMap<>();

        out.printLog("Iniciando calculo das metricas.");
        for (String vertexUser : graphMulti.getVertices()) {
            usersMetrics.put(vertexUser, new AuxUserMetrics(vertexUser,
                    btwGen.getVertexScore(vertexUser), // betweeness
                    dgrGen.getVertexScore(vertexUser), // degree
                    clsGen.getVertexScore(vertexUser))); // closeness
        }
        graphMulti = null;
        edgesWeigth.clear();

        List<AuxFileFileMetrics> fileMetrics = new ArrayList<>();

        out.printLog("Iniciando média, soma, updates, etc.");
        for (AuxFileFile pairFile : pairFiles) {
            Double btwMax = 0d, btwAve, btwSum = 0d;
            Double dgrMax = 0d, dgrAve, dgrSum = 0d;
            Double clsMax = 0d, clsAve, clsSum = 0d;
            Long codeChurn = 0l, futUpdates = 0l, updates = 0l, dev = 0l;
            Long codeChurn2 = 0l;

            for (String vertexUser : commitersPairFile.get(pairFile)) {
                AuxUserMetrics userMetric = usersMetrics.get(vertexUser);
                Double btw = userMetric.getMetrics()[0];
                btwMax = calculeMax(btw, btwMax);
                btwSum += btw;

                Double dgr = userMetric.getMetrics()[1];
                dgrMax = calculeMax(dgr, dgrMax);
                dgrSum += dgr;

                Double cls = userMetric.getMetrics()[2];
                clsMax = calculeMax(cls, clsMax);
                clsSum += cls;

                dev++;
            }

            btwAve = btwSum / dev;
            dgrAve = dgrSum / dev;
            clsAve = clsSum / dev;

            updates = calculeUpdates(pairFile.getFileName(), pairFile.getFileName2(), getBeginDate(), getEndDate());

            futUpdates = calculeUpdates(pairFile.getFileName(), pairFile.getFileName2(), futureBeginDate, futureEndDate);

            codeChurn = calculeCodeChurn(pairFile.getFileName(), pairFile.getFileName2(), getBeginDate(), getEndDate());
            codeChurn2 = calculeCodeChurn(pairFile.getFileName2(), pairFile.getFileName(), getBeginDate(), getEndDate());

            fileMetrics.add(new AuxFileFileMetrics(pairFile.getFileName(), pairFile.getFileName2(),
                    fixNanValue(btwMax), fixNanValue(btwAve), fixNanValue(btwSum),
                    fixNanValue(dgrMax), fixNanValue(dgrAve), fixNanValue(dgrSum),
                    fixNanValue(clsMax), fixNanValue(clsAve), fixNanValue(clsSum),
                    dev,
                    updates, futUpdates,
View Full Code Here

        // construindo a rede de comunicação para cada par de arquivo (desenvolvedores que comentaram)
        for (int i = 0; i < getMatrix().getNodes().size(); i++) {
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
           
            // ignora %README%, %Rakefile, %CHANGELOG%, %Gemfile%, %.gitignore
            if (isIgnored(pairFile.getFileName())
                    || isIgnored(pairFile.getFileName2())) {
                out.printLog("Ignoring " + pairFile);
                countIgnored++;
                continue;
            }
           
            PairFileDAO pairFileDAO = new PairFileDAO(dao);
           
            Long pairFileNumberOfPullrequestOfPairFuture = pairFileDAO
                    .calculeNumberOfPullRequest(repository,
                            pairFile.getFileName(), pairFile.getFileName2(),
                            futureBeginDate, futureEndDate, true);
            Long numberOfAllPullrequestFuture = pairFileDAO
                    .calculeNumberOfPullRequest(repository,
                            null, null, futureBeginDate, futureEndDate, true);
           
            Double supportPairFile = numberOfAllPullrequestFuture == 0 ? 0d :
                    pairFileNumberOfPullrequestOfPairFuture.doubleValue() /
                    numberOfAllPullrequestFuture.doubleValue();
           
           
            // minimum support is 0.01, ignore file if lower than this (0.01)
            if (supportPairFile < Double.valueOf(0.01d)) {
                out.printLog("Ignoring " + pairFile + ": support " + supportPairFile);
                countIgnored++;
                continue;
            }
           
            String commiter1 = columns[0];
            String commiter2 = columns[3];
           
            // adiciona conforme o peso
            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            edgesWeigth.put(edgeName, Util.stringToInteger(columns[4]));
           
            // check if network already created
            if (pairFileNetwork.containsKey(pairFile)) {
                pairFileNetwork.get(pairFile)
                        .addEdge(edgeName, commiter1, commiter2, EdgeType.DIRECTED);
            } else {
                DirectedSparseMultigraph<String, String> graphMulti =
                        new DirectedSparseMultigraph<>();
                graphMulti.addEdge(edgeName, commiter1, commiter2, EdgeType.DIRECTED);
                pairFileNetwork.put(pairFile, graphMulti);
            }
        }
       
        out.printLog("Número de ignorado: " + countIgnored);
       
        int size = pairFileNetwork.size();
        int i = 0;
        out.printLog("Número de pares: " + size);
        out.printLog("Iniciando cálculo das metricas.");

        Set<AuxFileFileMetrics> fileFileMetrics = new HashSet<>();
       
        // calcula as métricas para cada par de arquivos
        // é a soma das métricas de todos os desenvolvedores
        for (Map.Entry<AuxFileFile, DirectedSparseMultigraph<String, String>> entry : pairFileNetwork.entrySet()) {
            out.printLog(++i + "/" + size);
            out.printLog("Calculando metricas SNA...");
            AuxFileFile fileFile = entry.getKey();
            DirectedSparseMultigraph<String, String> graph = entry.getValue();
            GlobalMeasure global = GlobalMeasureCalculator.calcule(graph);
            Map<String, Double> barycenter = BarycenterCalculator.calcule(graph, edgesWeigth);
            Map<String, Double> betweenness = BetweennessCalculator.calcule(graph, edgesWeigth);
            Map<String, Double> closeness = ClosenessCalculator.calcule(graph, edgesWeigth);
            Map<String, Integer> degree = DegreeCalculator.calcule(graph);
            Map<String, Double> eigenvector = EigenvectorCalculator.calcule(graph, edgesWeigth);
            Map<String, EgoMeasure<String>> ego = EgoMeasureCalculator.calcule(graph, edgesWeigth);
            Map<String, StructuralHolesMeasure<String>> structuralHoles = StructuralHolesCalculator.calcule(graph, edgesWeigth);
           
            Double barycenterSum = 0d, barycenterAvg, barycenterMax = Double.NEGATIVE_INFINITY;
            Double betweennessSum = 0d, betweennessAvg, betweennessMax = Double.NEGATIVE_INFINITY;
            Double closenessSum = 0d, closenessAvg, closenessMax = Double.NEGATIVE_INFINITY;
            Integer degreeSum = 0, degreeMax = Integer.MIN_VALUE;
            Double degreeAvg;
            Double eigenvectorSum = 0d, eigenvectorAvg, eigenvectorMax = Double.NEGATIVE_INFINITY;
           
            Double egoBetweennessSum = 0d, egoBetweennessAvg, egoBetweennessMax = Double.NEGATIVE_INFINITY;
            Long egoSizeSum = 0l, egoSizeMax = Long.MIN_VALUE;
//            Long egoPairsSum = 0l, egoPairsMax = Long.MIN_VALUE;
            Long egoTiesSum = 0l, egoTiesMax = Long.MIN_VALUE;
            Double egoSizeAvg, /*egoPairsAvg,*/ egoTiesAvg;
            Double egoDensitySum = 0d, egoDensityAvg, egoDensityMax = Double.NEGATIVE_INFINITY;
           
            Double efficiencySum = 0.0d, efficiencyAvg, efficiencyMax = Double.NEGATIVE_INFINITY;
            Double effectiveSizeSum = 0.0d, effectiveSizeAvg, effectiveSizeMax = Double.NEGATIVE_INFINITY;
            Double constraintSum = 0.0d, constraintAvg, constraintMax = Double.NEGATIVE_INFINITY;
            Double hierarchySum = 0.0d, hierarchyAvg, hierarchyMax = Double.NEGATIVE_INFINITY;
           
            out.printLog("Calculando as somas, máximas e médias...");
            for (String dev : graph.getVertices()) {
                // sums calculation
                barycenterSum += barycenter.get(dev);
                betweennessSum += betweenness.get(dev);
                closenessSum += closeness.get(dev);
                degreeSum += degree.get(dev);
                eigenvectorSum += eigenvector.get(dev);
               
                egoBetweennessSum += ego.get(dev).getBetweennessCentrality();
                egoSizeSum += ego.get(dev).getSize();
//                egoPairsSum += ego.get(dev).getPairs();
                egoTiesSum += ego.get(dev).getTies();
                egoDensitySum += ego.get(dev).getDensity();
               
                efficiencySum += structuralHoles.get(dev).getEfficiency();
                effectiveSizeSum += structuralHoles.get(dev).getEffectiveSize();
                constraintSum += structuralHoles.get(dev).getConstraint();
                hierarchySum += structuralHoles.get(dev).getHierarchy();
               
                // maximum calculation
                barycenterMax = Math.max(barycenterMax, barycenter.get(dev));
                betweennessMax = Math.max(betweennessMax, betweenness.get(dev));
                closenessMax = Math.max(closenessMax, closeness.get(dev));
                degreeMax = Math.max(degreeMax, degree.get(dev));
                eigenvectorMax = Math.max(eigenvectorMax, eigenvector.get(dev));
               
                egoBetweennessMax = Math.max(egoBetweennessMax, ego.get(dev).getBetweennessCentrality());
                egoSizeMax = Math.max(egoSizeMax, ego.get(dev).getSize());
//                egoPairsMax = Math.max(egoPairsMax, ego.get(dev).getPairs());
                egoTiesMax = Math.max(egoTiesMax, ego.get(dev).getTies());
                egoDensityMax = Math.max(egoDensityMax, ego.get(dev).getDensity());
               
                efficiencyMax = Math.max(efficiencyMax, structuralHoles.get(dev).getEfficiency());
                effectiveSizeMax = Math.max(effectiveSizeMax, structuralHoles.get(dev).getEffectiveSize());
                constraintMax = Math.max(constraintMax, structuralHoles.get(dev).getConstraint());
                hierarchyMax = Math.max(hierarchyMax, structuralHoles.get(dev).getHierarchy());
            }
           
            // average calculation
            double devCount = graph.getVertexCount();
            barycenterAvg = barycenterSum / (double) devCount;
            betweennessAvg = betweennessSum / (double) devCount;
            closenessAvg = closenessSum / (double) devCount;
            degreeAvg = degreeSum / (double) devCount;
            eigenvectorAvg = eigenvectorSum / (double) devCount;
           
            egoBetweennessAvg = egoBetweennessSum / (double) devCount;
            egoSizeAvg = egoSizeSum / (double) devCount;
//            egoPairsAvg = egoPairsSum / (double) devCount;
            egoTiesAvg = egoTiesSum / (double) devCount;
            egoDensityAvg = egoDensitySum / (double) devCount;
           
            efficiencyAvg = efficiencySum / (double) devCount;
            effectiveSizeAvg = effectiveSizeSum / (double) devCount;
            constraintAvg = constraintSum / (double) devCount;
            hierarchyAvg = hierarchySum / (double) devCount;
           
            out.printLog("Calculando updates e code churn...");
            Long updates = calculeUpdates(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    getBeginDate(), getEndDate());

            Long futureUpdates = calculeUpdates(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    futureBeginDate, futureEndDate);

            Long codeChurn = calculeCodeChurn(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    getBeginDate(), getEndDate());
            Long codeChurn2 = calculeCodeChurn(
                    fileFile.getFileName2(), fileFile.getFileName(),
                    getBeginDate(), getEndDate());

            double codeChurnAvg = (codeChurn + codeChurn2) / 2.0d;
           
            AuxFileFileMetrics auxFileFileMetrics = new AuxFileFileMetrics(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    barycenterSum, barycenterAvg, barycenterMax,
                    betweennessSum, betweennessAvg, betweennessMax,
                    closenessSum, closenessAvg, closenessMax,
                    degreeSum, degreeAvg, degreeMax,
                    eigenvectorSum, eigenvectorAvg, eigenvectorMax,
View Full Code Here

                EntityCommitFile file1 = commitFiles.get(i);
                for (int j = i + 1; j < commitFiles.size(); j++) {
                    EntityCommitFile file2 = commitFiles.get(j);
                    if (!file1.equals(file2)
                            && !Util.stringEquals(file1.getFilename(), file2.getFilename())) {
                        tempResultFiles.add(new AuxFileFile(file1.getFilename(), file2.getFilename()));
                    }
                }
            }
            commitFiles.clear();
View Full Code Here

                System.out.println(count + "/" + nodesSize);
            }
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
            pairFilesSet.add(pairFile);
            // ignora %README%, %Rakefile, %CHANGELOG%, %Gemfile%, %.gitignore
//            if (isIgnored(pairFile.getFileName())
//                    || isIgnored(pairFile.getFileName2())) {
//                out.printLog("Ignoring " + pairFile);
//                countIgnored++;
//                continue;
//            }
           
//            Long pairFileNumberOfPullrequestOfPairFuture;
//            if (futurePullRequest.containsKey(pairFile.toString())) {
//                pairFileNumberOfPullrequestOfPairFuture = futurePullRequest.get(pairFile.toString());
//            } else {
//                pairFileNumberOfPullrequestOfPairFuture = bichoPairFileDAO
//                    .calculeNumberOfIssues(
//                            pairFile.getFileName(), pairFile.getFileName2(),
//                            futureBeginDate, futureEndDate, true);
//                futurePullRequest.put(pairFile.toString(), pairFileNumberOfPullrequestOfPairFuture);
//            }
           
//            Double supportPairFile = numberOfAllPullrequestFuture == 0 ? 0d :
//                    pairFileNumberOfPullrequestOfPairFuture.doubleValue() /
//                    numberOfAllPullrequestFuture.doubleValue();
           
           
            // minimum support is 0.01, ignore file if lower than this (0.01)
//            if (supportPairFile < Double.valueOf(0.01d)) {
//            if (pairFileNumberOfPullrequestOfPairFuture < 2) {
//                out.printLog("Ignoring " + pairFile + ": future pull requests " + pairFileNumberOfPullrequestOfPairFuture);
//                countIgnored++;
//                continue;
//            }
           
            String commiter1 = columns[0];
            String commiter2 = columns[3];
           
            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(commiter1);
                commiters.add(commiter2);
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(commiter1);
                commiters.add(commiter2);
                commitersPairFile.put(pairFile, commiters);
            }

            // adiciona conforme o peso
//            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);
           
            /* Sum commit for each pair file that the pair devCommentter has commited. */
            // user > user2 - directed edge
            if (edgesWeigth.containsKey(pairUser.toStringUserAndUser2())) {
                // edgeName = user + user2
                edgesWeigth.put(pairUser.toStringUserAndUser2(), edgesWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
//            // for undirectional graph
//            } else if (edgesWeigth.containsKey(pairUser.toStringUser2AndUser())) {
//                // edgeName = user2 + user - undirected edge
//                edgesWeigth.put(pairUser.toStringUser2AndUser(), edgesWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
            } else {
                edgesWeigth.put(pairUser.toStringUserAndUser2(), Integer.valueOf(columns[4]));
            }
           
            if (!graph.containsVertex(pairUser.getUser())
                    || !graph.containsVertex(pairUser.getUser2())
                    || !graph.containsEdge(pairUser.toStringUserAndUser2())) {
                graph.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            }
               
            // check if network already created
            if (pairFileNetwork.containsKey(pairFile)) {
                pairFileNetwork.get(pairFile)
                        .addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            } else {
                DirectedSparseGraph<String, String> graphMulti
                        = new DirectedSparseGraph<>();
                graphMulti.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
                pairFileNetwork.put(pairFile, graphMulti);
            }
        }
        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
        JungExport.exportToImage(graph, "C:/Users/a562273/Desktop/networks/",
                repository + " Single " + format.format(beginDate) + " a " + format.format(endDate));
       
        out.printLog("Número de pares de arquivos ignoradoa: " + countIgnored);
       
        out.printLog("Número de autores de comentários (commenters): " + graph.getVertexCount());
        out.printLog("Número de pares de arquivos: " + commitersPairFile.size());
        out.printLog("Número de pares de arquivos new: " + pairFilesSet.size());
        out.printLog("Iniciando cálculo das métricas.");

        Set<AuxFileFileMetrics> fileFileMetrics = new HashSet<>();
       
        out.printLog("Calculando metricas SNA...");

        GlobalMeasure global = GlobalMeasureCalculator.calcule(graph);
        out.printLog("Global measures: " + global.toString());
        // Map<String, Double> barycenter = BarycenterCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> betweenness = BetweennessCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> closeness = ClosenessCalculator.calcule(graph, edgesWeigth);
        Map<String, Integer> degree = DegreeCalculator.calcule(graph);
        Map<String, Double> eigenvector = EigenvectorCalculator.calcule(graph, edgesWeigth);
        Map<String, EgoMeasure<String>> ego = EgoMeasureCalculator.calcule(graph, edgesWeigth);
        Map<String, StructuralHolesMeasure<String>> structuralHoles = StructuralHolesCalculator.calcule(graph, edgesWeigth);

        // number of pull requests in date interval
        Long numberOfAllPullrequestFuture = issuesSize;
        // cache for optimization number of pull requests where file is in,
        // reducing access to database
        Map<String, Long> issueFileMap = new HashMap<>();
        // cache for optimization file code churn (add, del, change),
        // reducing access to database
        Map<String, AuxCodeChurn> codeChurnRequestFileMap = new HashMap<>();
        Map<String, AuxCodeChurn> cummulativeCodeChurnRequestFileMap = new HashMap<>();
        // cache for optimization file commits made by user,
        // reducing access to database
        Map<String, AuxCodeChurn> fileUserCommitMap = new HashMap<>();

        out.printLog("Calculando somas, máximas, médias, updates, code churn e apriori para cada par de arquivos...");
        count = 0;
        final int size = commitersPairFile.entrySet().size();
        out.printLog("Número de pares de arquivos: " + commitersPairFile.keySet().size());
        for (Map.Entry<AuxFileFile, Set<String>> entry : commitersPairFile.entrySet()) {
            if (count++ % 100 == 0 || count == size) {
                System.out.println(count + "/" + size);
            }
            AuxFileFile fileFile = entry.getKey();
            Set<String> devsCommentters = entry.getValue();
           
            // pair file network
            GlobalMeasure pairFileGlobal = GlobalMeasureCalculator.calcule(pairFileNetwork.get(fileFile));
           
//            Double barycenterSum = 0d, barycenterAvg, barycenterMax = Double.NEGATIVE_INFINITY;
            Double betweennessSum = 0d, betweennessAvg, betweennessMax = Double.NEGATIVE_INFINITY;
            Double closenessSum = 0d, closenessAvg, closenessMax = Double.NEGATIVE_INFINITY;
            Integer degreeSum = 0, degreeMax = Integer.MIN_VALUE;
            Double degreeAvg;
            Double eigenvectorSum = 0d, eigenvectorAvg, eigenvectorMax = Double.NEGATIVE_INFINITY;

            Double egoBetweennessSum = 0d, egoBetweennessAvg, egoBetweennessMax = Double.NEGATIVE_INFINITY;
            Long egoSizeSum = 0l, egoSizeMax = Long.MIN_VALUE;
//            Long egoPairsSum = 0l, egoPairsMax = Long.MIN_VALUE;
            Long egoTiesSum = 0l, egoTiesMax = Long.MIN_VALUE;
            Double egoSizeAvg, /*egoPairsAvg,*/ egoTiesAvg;
            Double egoDensitySum = 0d, egoDensityAvg, egoDensityMax = Double.NEGATIVE_INFINITY;

            Double efficiencySum = 0.0d, efficiencyAvg, efficiencyMax = Double.NEGATIVE_INFINITY;
            Double effectiveSizeSum = 0.0d, effectiveSizeAvg, effectiveSizeMax = Double.NEGATIVE_INFINITY;
            Double constraintSum = 0.0d, constraintAvg, constraintMax = Double.NEGATIVE_INFINITY;
            Double hierarchySum = 0.0d, hierarchyAvg, hierarchyMax = Double.NEGATIVE_INFINITY;

            for (String commenter : devsCommentters) {
                // sums calculation
//                barycenterSum += barycenter.get(commenter);
                betweennessSum += betweenness.get(commenter);
                closenessSum += Double.isInfinite(closeness.get(commenter)) ? 0 : closeness.get(commenter);
                degreeSum += degree.get(commenter);
//                eigenvectorSum += eigenvector.get(commenter);

                egoBetweennessSum += ego.get(commenter).getBetweennessCentrality();
                egoSizeSum += ego.get(commenter).getSize();
//                egoPairsSum += ego.get(commenter).getPairs();
                egoTiesSum += ego.get(commenter).getTies();
                egoDensitySum += ego.get(commenter).getDensity();

                efficiencySum += structuralHoles.get(commenter).getEfficiency();
                effectiveSizeSum += structuralHoles.get(commenter).getEffectiveSize();
                constraintSum += structuralHoles.get(commenter).getConstraint();
                hierarchySum += structuralHoles.get(commenter).getHierarchy();
                // maximum calculation
//                barycenterMax = Math.max(barycenterMax, barycenter.get(commenter));
                betweennessMax = Math.max(betweennessMax, betweenness.get(commenter));
                closenessMax = Math.max(closenessMax, Double.isInfinite(closeness.get(commenter)) ? 0 : closeness.get(commenter));
                degreeMax = Math.max(degreeMax, degree.get(commenter));
                eigenvectorMax = Math.max(eigenvectorMax, eigenvector.get(commenter));

                egoBetweennessMax = Math.max(egoBetweennessMax, ego.get(commenter).getBetweennessCentrality());
                egoSizeMax = Math.max(egoSizeMax, ego.get(commenter).getSize());
//                egoPairsMax = Math.max(egoPairsMax, ego.get(commenter).getPairs());
                egoTiesMax = Math.max(egoTiesMax, ego.get(commenter).getTies());
                egoDensityMax = Math.max(egoDensityMax, ego.get(commenter).getDensity());

                efficiencyMax = Math.max(efficiencyMax, structuralHoles.get(commenter).getEfficiency());
                effectiveSizeMax = Math.max(effectiveSizeMax, structuralHoles.get(commenter).getEffectiveSize());
                constraintMax = Math.max(constraintMax, structuralHoles.get(commenter).getConstraint());
                hierarchyMax = Math.max(hierarchyMax, structuralHoles.get(commenter).getHierarchy());

            }

            // Average calculation /////////////////////////////////////////////
            Integer distinctCommentersCount = devsCommentters.size();
//            barycenterAvg = barycenterSum / (double) distinctCommentersCount;
            betweennessAvg = betweennessSum / distinctCommentersCount.doubleValue();
            closenessAvg = closenessSum / distinctCommentersCount.doubleValue();
            degreeAvg = degreeSum / distinctCommentersCount.doubleValue();
            eigenvectorAvg = eigenvectorSum / distinctCommentersCount.doubleValue();

            egoBetweennessAvg = egoBetweennessSum / distinctCommentersCount.doubleValue();
            egoSizeAvg = egoSizeSum / distinctCommentersCount.doubleValue();
//            egoPairsAvg = egoPairsSum / distinctCommentersCount;
            egoTiesAvg = egoTiesSum / distinctCommentersCount.doubleValue();
            egoDensityAvg = egoDensitySum / distinctCommentersCount.doubleValue();

            efficiencyAvg = efficiencySum / distinctCommentersCount.doubleValue();
            effectiveSizeAvg = effectiveSizeSum / distinctCommentersCount.doubleValue();
            constraintAvg = constraintSum / distinctCommentersCount.doubleValue();
            hierarchyAvg = hierarchySum / distinctCommentersCount.doubleValue();

            // Commit-based metrics ////////////////////////////////////////////
            final long changes = calculeFileCodeChurn(codeChurnRequestFileMap, fileFile.getFileName(), bichoFileDAO, beginDate, endDate);
            final long changes2 = calculeFileCodeChurn(codeChurnRequestFileMap, fileFile.getFileName2(), bichoFileDAO, beginDate, endDate);

            final long cummulativeChanges = calculeFileCodeChurn(cummulativeCodeChurnRequestFileMap, fileFile.getFileName(), bichoFileDAO, null, endDate);
            final long cummulativeChanges2 = calculeFileCodeChurn(cummulativeCodeChurnRequestFileMap, fileFile.getFileName2(), bichoFileDAO, null, endDate);

            Set<AuxUser> devsCommitters = bichoPairFileDAO.selectCommitters(
                    fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate);

            Long devCommitsSum = 0l, devCommitsMax = 0l;
            Double devCommitsAvg;
            Double ownershipSum = 0.0d, ownershipAvg, ownershipMax = 0.0d;
            Long minorContributors = 0l, majorContributors = 0l;
            Double ownerExperience = 0.0d, ownerExperience2 = 0.0d, cummulativeOwnerExperience = 0.0d, cummulativeOwnerExperience2 = 0.0d;

            long committers = devsCommitters.size();
            long distinctCommitters = bichoPairFileDAO.calculeCommitters(
                    fileFile.getFileName(), fileFile.getFileName2(), null, endDate);

            Long commits = bichoPairFileDAO.calculeCommits(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate);

            for (AuxUser devCommitter : devsCommitters) {
                Long devCommits = bichoPairFileDAO.calculeCommits(
                        fileFile.getFileName(), fileFile.getFileName2(), devCommitter.getUser(),
                        beginDate, endDate);
                devCommitsSum += devCommits;

                Double ownership = devCommits.doubleValue() / commits.doubleValue();
                ownershipSum += ownership;

                if (ownership <= 0.05) { // menor ou igual que 5% = minor
                    minorContributors++;
                } else { // maior que 5% = major
                    majorContributors++;
                }

                devCommitsMax = Math.max(devCommitsMax, devCommits);
                ownershipMax = Math.max(ownershipMax, ownership);

                // Calculing OEXP of each file
                Double experience = calculeDevFileExperience(changes, fileUserCommitMap, fileFile.getFileName(), devCommitter.getUser(), bichoFileDAO, beginDate, endDate);
                ownerExperience = Math.max(experience, ownerExperience);

                Double experience2 = calculeDevFileExperience(changes2, fileUserCommitMap, fileFile.getFileName2(), devCommitter.getUser(), bichoFileDAO, beginDate, endDate);
                ownerExperience2 = Math.max(experience2, ownerExperience2);

                // Calculing OWN
                Double cumulativeExperience = calculeDevFileExperience(cummulativeChanges, fileUserCommitMap, fileFile.getFileName(), devCommitter.getUser(), bichoFileDAO, null, endDate);
                cummulativeOwnerExperience = Math.max(cummulativeOwnerExperience, cumulativeExperience);

                Double cumulativeExperience2 = calculeDevFileExperience(cummulativeChanges2, fileUserCommitMap, fileFile.getFileName2(), devCommitter.getUser(), bichoFileDAO, null, endDate);
                cummulativeOwnerExperience2 = Math.max(cummulativeOwnerExperience2, cumulativeExperience2);

            }

            devCommitsAvg = (double) devCommitsSum / (double) committers;
            ownershipAvg = (double) ownershipSum / (double) committers;

//            double majorContributorsRate = (double) majorContributors / (double) committers; // % de major
//            double minorContributorsRate = (double) minorContributors / (double) committers; // % de minor

            Long updates = bichoPairFileDAO.calculeNumberOfIssues(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate, true);

            Long futureUpdates;
            if (beginDate.equals(futureBeginDate) && endDate.equals(futureEndDate)) {
                futureUpdates = updates;
            } else {
                futureUpdates = bichoPairFileDAO.calculeNumberOfIssues(
                        fileFile.getFileName(), fileFile.getFileName2(),
                        futureBeginDate, futureEndDate, true);
            }

            // list all issues and its comments
            Collection<AuxWordiness> issuesAndComments = bichoPairFileDAO.listIssues(
                    fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate, true);

            long wordiness = 0;
            for (AuxWordiness auxWordiness : issuesAndComments) {
                wordiness += WordinessCalculator.calcule(auxWordiness);
            }

            Long commentsSum = bichoPairFileDAO.calculeComments(
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate, true);

            Long codeChurn = 0l/*bichoFileDAO.calculeCodeChurn(
                     fileFile.getFileName(), beginDate, endDate)*/;
            Long codeChurn2 = 0l /*bichoFileDAO.calculeCodeChurn(
                     fileFile.getFileName2(), beginDate, endDate)*/;

            AuxCodeChurn pairFileCodeChurn = bichoPairFileDAO.calculeCodeChurnAddDelChange(
                    fileFile.getFileName2(), fileFile.getFileName(),
                    beginDate, endDate);

            double codeChurnAvg = (codeChurn + codeChurn2) / 2.0d;

            closenessSum = MathUtils.zeroIfNaN(closenessSum);
            closenessAvg = MathUtils.zeroIfNaN(closenessAvg);
            closenessMax = MathUtils.zeroIfNaN(closenessMax);

            // pair file age in release interval (days)
            int ageRelease = bichoPairFileDAO.calculePairFileDaysAge( fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate, true);

            // pair file age in total until final date (days)
            int ageTotal = bichoPairFileDAO.calculePairFileDaysAge( fileFile.getFileName(), fileFile.getFileName2(), null, endDate, true);

            boolean samePackage = PathUtils.isSameFullPath(fileFile.getFileName(), fileFile.getFileName2());

            AuxFileFileMetrics auxFileFileMetrics = new AuxFileFileMetrics(
                    fileFile.getFileName(), fileFile.getFileName2(), BooleanUtils.toInteger(samePackage),
                    //                        barycenterSum, barycenterAvg, barycenterMax,
                    betweennessSum, betweennessAvg, betweennessMax,
                    closenessSum, closenessAvg, closenessMax,
                    degreeSum, degreeAvg, degreeMax,
                    eigenvectorSum, eigenvectorAvg, eigenvectorMax,
View Full Code Here

                System.out.println(count + "/" + nodesSize);
            }
            EntityMatrixNode node = getMatrix().getNodes().get(i);
            String[] columns = node.getLine().split(JsfUtil.TOKEN_SEPARATOR);

            AuxFileFile pairFile = new AuxFileFile(columns[1], columns[2]);
            pairFilesSet.add(pairFile);
            // ignora %README%, %Rakefile, %CHANGELOG%, %Gemfile%, %.gitignore
//            if (isIgnored(pairFile.getFileName())
//                    || isIgnored(pairFile.getFileName2())) {
//                out.printLog("Ignoring " + pairFile);
//                countIgnored++;
//                continue;
//            }
           
//            Long pairFileNumberOfPullrequestOfPairFuture;
//            if (futurePullRequest.containsKey(pairFile.toString())) {
//                pairFileNumberOfPullrequestOfPairFuture = futurePullRequest.get(pairFile.toString());
//            } else {
//                pairFileNumberOfPullrequestOfPairFuture = pairFileDAO
//                    .calculeNumberOfPullRequest(repository,
//                            pairFile.getFileName(), pairFile.getFileName2(),
//                            futureBeginDate, futureEndDate, true);
//                futurePullRequest.put(pairFile.toString(), pairFileNumberOfPullrequestOfPairFuture);
//            }
           
//            Double supportPairFile = numberOfAllPullrequestFuture == 0 ? 0d :
//                    pairFileNumberOfPullrequestOfPairFuture.doubleValue() /
//                    numberOfAllPullrequestFuture.doubleValue();
           
           
            // minimum support is 0.01, ignore file if lower than this (0.01)
//            if (supportPairFile < Double.valueOf(0.01d)) {
//            if (pairFileNumberOfPullrequestOfPairFuture < 2) {
//                out.printLog("Ignoring " + pairFile + ": future pull requests " + pairFileNumberOfPullrequestOfPairFuture);
//                countIgnored++;
//                continue;
//            }
           
            String commiter1 = columns[0];
            String commiter2 = columns[3];
           
            /**
             * Extract all distinct developer that commit a pair of file
             */
            if (commitersPairFile.containsKey(pairFile)) {
                Set<String> commiters = commitersPairFile.get(pairFile);
                commiters.add(commiter1);
                commiters.add(commiter2);
            } else {
                Set<String> commiters = new HashSet<>();
                commiters.add(commiter1);
                commiters.add(commiter2);
                commitersPairFile.put(pairFile, commiters);
            }

            // adiciona conforme o peso
//            String edgeName = pairFile.getFileName() + "-" + pairFile.getFileName2() + "-" + i;
            AuxUserUser pairUser = new AuxUserUser(columns[0], columns[3]);
           
            /* Sum commit for each pair file that the pair devCommentter has commited. */
            // user > user2 - directed edge
            if (edgesWeigth.containsKey(pairUser.toStringUserAndUser2())) {
                // edgeName = user + user2
                edgesWeigth.put(pairUser.toStringUserAndUser2(), edgesWeigth.get(pairUser.toStringUserAndUser2()) + Integer.valueOf(columns[4]));
//            // for undirectional graph
//            } else if (edgesWeigth.containsKey(pairUser.toStringUser2AndUser())) {
//                // edgeName = user2 + user - undirected edge
//                edgesWeigth.put(pairUser.toStringUser2AndUser(), edgesWeigth.get(pairUser.toStringUser2AndUser()) + Integer.valueOf(columns[4]));
            } else {
                edgesWeigth.put(pairUser.toStringUserAndUser2(), Integer.valueOf(columns[4]));
            }
           
            if (!graph.containsVertex(pairUser.getUser())
                    || !graph.containsVertex(pairUser.getUser2())
                    || !graph.containsEdge(pairUser.toStringUserAndUser2())) {
                graph.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            }
               
            // check if network already created
            if (pairFileNetwork.containsKey(pairFile)) {
                pairFileNetwork.get(pairFile)
                        .addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
            } else {
                DirectedSparseGraph<String, String> graphMulti
                        = new DirectedSparseGraph<>();
                graphMulti.addEdge(pairUser.toStringUserAndUser2(), pairUser.getUser(), pairUser.getUser2(), EdgeType.DIRECTED);
                pairFileNetwork.put(pairFile, graphMulti);
            }
        }
        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
        JungExport.exportToImage(graph, "C:/Users/a562273/Desktop/networks/",
                repository.getName() + " Single " + format.format(beginDate) + " a " + format.format(endDate));
       
        out.printLog("Número de pares de arquivos ignoradoa: " + countIgnored);
       
        out.printLog("Número de autores de comentários (commenters): " + graph.getVertexCount());
        out.printLog("Número de pares de arquivos: " + commitersPairFile.size());
        out.printLog("Número de pares de arquivos new: " + pairFilesSet.size());
        out.printLog("Iniciando cálculo das métricas.");

        Set<AuxFileFileMetrics> fileFileMetrics = new HashSet<>();
       
        out.printLog("Calculando metricas SNA...");

        GlobalMeasure global = GlobalMeasureCalculator.calcule(graph);
        out.printLog("Global measures: " + global.toString());
        // Map<String, Double> barycenter = BarycenterCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> betweenness = BetweennessCalculator.calcule(graph, edgesWeigth);
        Map<String, Double> closeness = ClosenessCalculator.calcule(graph, edgesWeigth);
        Map<String, Integer> degree = DegreeCalculator.calcule(graph);
         Map<String, Double> eigenvector = EigenvectorCalculator.calcule(graph, edgesWeigth);
        Map<String, EgoMeasure<String>> ego = EgoMeasureCalculator.calcule(graph, edgesWeigth);
        Map<String, StructuralHolesMeasure<String>> structuralHoles = StructuralHolesCalculator.calcule(graph, edgesWeigth);

        // number of pull requests in date interval
        Long numberOfAllPullrequestFuture = pairFileDAO.calculeNumberOfPullRequest(getRepository(), null, null, futureBeginDate, futureEndDate, true);
        // cache for optimization number of pull requests where file is in,
        // reducing access to database
        Map<String, Long> pullRequestFileMap = new HashMap<>();
        // cache for optimization file code churn (add, del, change),
        // reducing access to database
        Map<String, AuxCodeChurn> codeChurnRequestFileMap = new HashMap<>();
        Map<String, AuxCodeChurn> cummulativeCodeChurnRequestFileMap = new HashMap<>();
        // cache for optimization file commits made by user,
        // reducing access to database
        Map<String, AuxCodeChurn> fileUserCommitMap = new HashMap<>();

        out.printLog("Calculando somas, máximas, médias, updates, code churn e apriori para cada par de arquivos...");
        count = 0;
        final int size = commitersPairFile.entrySet().size();
        out.printLog("Número de pares de arquivos: " + commitersPairFile.keySet().size());
        for (Map.Entry<AuxFileFile, Set<String>> entry : commitersPairFile.entrySet()) {
            if (count++ % 100 == 0 || count == size) {
                System.out.println(count + "/" + size);
            }
            AuxFileFile fileFile = entry.getKey();
            Set<String> devsCommentters = entry.getValue();
           
            // pair file network
            GlobalMeasure pairFileGlobal = GlobalMeasureCalculator.calcule(pairFileNetwork.get(fileFile));
           
//            Double barycenterSum = 0d, barycenterAvg, barycenterMax = Double.NEGATIVE_INFINITY;
            Double betweennessSum = 0d, betweennessAvg, betweennessMax = Double.NEGATIVE_INFINITY;
            Double closenessSum = 0d, closenessAvg, closenessMax = Double.NEGATIVE_INFINITY;
            Integer degreeSum = 0, degreeMax = Integer.MIN_VALUE;
            Double degreeAvg;
            Double eigenvectorSum = 0d, eigenvectorAvg, eigenvectorMax = Double.NEGATIVE_INFINITY;

            Double egoBetweennessSum = 0d, egoBetweennessAvg, egoBetweennessMax = Double.NEGATIVE_INFINITY;
            Long egoSizeSum = 0l, egoSizeMax = Long.MIN_VALUE;
//            Long egoPairsSum = 0l, egoPairsMax = Long.MIN_VALUE;
            Long egoTiesSum = 0l, egoTiesMax = Long.MIN_VALUE;
            Double egoSizeAvg, /*egoPairsAvg,*/ egoTiesAvg;
            Double egoDensitySum = 0d, egoDensityAvg, egoDensityMax = Double.NEGATIVE_INFINITY;

            Double efficiencySum = 0.0d, efficiencyAvg, efficiencyMax = Double.NEGATIVE_INFINITY;
            Double effectiveSizeSum = 0.0d, effectiveSizeAvg, effectiveSizeMax = Double.NEGATIVE_INFINITY;
            Double constraintSum = 0.0d, constraintAvg, constraintMax = Double.NEGATIVE_INFINITY;
            Double hierarchySum = 0.0d, hierarchyAvg, hierarchyMax = Double.NEGATIVE_INFINITY;

            for (String commenter : devsCommentters) {
                // sums calculation
//                barycenterSum += barycenter.get(commenter);
                betweennessSum += betweenness.get(commenter);
                closenessSum += Double.isInfinite(closeness.get(commenter)) ? 0 : closeness.get(commenter);
                degreeSum += degree.get(commenter);
//                eigenvectorSum += eigenvector.get(commenter);

                egoBetweennessSum += ego.get(commenter).getBetweennessCentrality();
                egoSizeSum += ego.get(commenter).getSize();
//                egoPairsSum += ego.get(commenter).getPairs();
                egoTiesSum += ego.get(commenter).getTies();
                egoDensitySum += ego.get(commenter).getDensity();

                efficiencySum += structuralHoles.get(commenter).getEfficiency();
                effectiveSizeSum += structuralHoles.get(commenter).getEffectiveSize();
                constraintSum += structuralHoles.get(commenter).getConstraint();
                hierarchySum += structuralHoles.get(commenter).getHierarchy();
                // maximum calculation
//                barycenterMax = Math.max(barycenterMax, barycenter.get(commenter));
                betweennessMax = Math.max(betweennessMax, betweenness.get(commenter));
                closenessMax = Math.max(closenessMax, Double.isInfinite(closeness.get(commenter)) ? 0 : closeness.get(commenter));
                degreeMax = Math.max(degreeMax, degree.get(commenter));
                eigenvectorMax = Math.max(eigenvectorMax, eigenvector.get(commenter));

                egoBetweennessMax = Math.max(egoBetweennessMax, ego.get(commenter).getBetweennessCentrality());
                egoSizeMax = Math.max(egoSizeMax, ego.get(commenter).getSize());
//                egoPairsMax = Math.max(egoPairsMax, ego.get(commenter).getPairs());
                egoTiesMax = Math.max(egoTiesMax, ego.get(commenter).getTies());
                egoDensityMax = Math.max(egoDensityMax, ego.get(commenter).getDensity());

                efficiencyMax = Math.max(efficiencyMax, structuralHoles.get(commenter).getEfficiency());
                effectiveSizeMax = Math.max(effectiveSizeMax, structuralHoles.get(commenter).getEffectiveSize());
                constraintMax = Math.max(constraintMax, structuralHoles.get(commenter).getConstraint());
                hierarchyMax = Math.max(hierarchyMax, structuralHoles.get(commenter).getHierarchy());

            }

            // Average calculation /////////////////////////////////////////////
            Integer distinctCommentersCount = devsCommentters.size();
//            barycenterAvg = barycenterSum / (double) distinctCommentersCount;
            betweennessAvg = betweennessSum / distinctCommentersCount.doubleValue();
            closenessAvg = closenessSum / distinctCommentersCount.doubleValue();
            degreeAvg = degreeSum / distinctCommentersCount.doubleValue();
            eigenvectorAvg = eigenvectorSum / distinctCommentersCount.doubleValue();

            egoBetweennessAvg = egoBetweennessSum / distinctCommentersCount.doubleValue();
            egoSizeAvg = egoSizeSum / distinctCommentersCount.doubleValue();
//            egoPairsAvg = egoPairsSum / distinctCommentersCount;
            egoTiesAvg = egoTiesSum / distinctCommentersCount.doubleValue();
            egoDensityAvg = egoDensitySum / distinctCommentersCount.doubleValue();

            efficiencyAvg = efficiencySum / distinctCommentersCount.doubleValue();
            effectiveSizeAvg = effectiveSizeSum / distinctCommentersCount.doubleValue();
            constraintAvg = constraintSum / distinctCommentersCount.doubleValue();
            hierarchyAvg = hierarchySum / distinctCommentersCount.doubleValue();

            // Weighted geometric average: issue > committers + commits ////////
            final long[][] committersCommitsPerIssue = pairFileDAO.calculeCommittersXCommits(
                    repository, fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate);
            final double geometricAverageCommittersCommits
                    = MathUtils.calculateWeightedGeometricAverage(committersCommitsPerIssue);

            // Commit-based metrics ////////////////////////////////////////////
            final long changes = calculeFileCodeChurn(codeChurnRequestFileMap, fileFile.getFileName(), fileDAO, beginDate, endDate);
            final long changes2 = calculeFileCodeChurn(codeChurnRequestFileMap, fileFile.getFileName2(), fileDAO, beginDate, endDate);

            final long cummulativeChanges = calculeFileCodeChurn(cummulativeCodeChurnRequestFileMap, fileFile.getFileName(), fileDAO, null, endDate);
            final long cummulativeChanges2 = calculeFileCodeChurn(cummulativeCodeChurnRequestFileMap, fileFile.getFileName2(), fileDAO, null, endDate);

            Set<AuxUser> devsCommitters = pairFileDAO.selectCommitters(repository,
                    fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate);

            Long devCommitsSum = 0l, devCommitsMax = 0l;
            Double devCommitsAvg;
            Double ownershipSum = 0.0d, ownershipAvg, ownershipMax = 0.0d;
            Long minorContributors = 0l, majorContributors = 0l;
            Double ownerExperience = 0.0d, ownerExperience2 = 0.0d, cummulativeOwnerExperience = 0.0d, cummulativeOwnerExperience2 = 0.0d;

            long committers = devsCommitters.size();
            long distinctCommitters = pairFileDAO.calculeCommitters(repository,
                    fileFile.getFileName(), fileFile.getFileName2(), null, endDate);

            Long commits = pairFileDAO.calculeCommits(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate);

            for (AuxUser devCommitter : devsCommitters) {
                Long devCommits = pairFileDAO.calculeCommits(repository,
                        fileFile.getFileName(), fileFile.getFileName2(), devCommitter.getUser(),
                        beginDate, endDate);
                devCommitsSum += devCommits;

                Double ownership = devCommits.doubleValue() / commits.doubleValue();
                ownershipSum += ownership;

                if (ownership <= 0.05) { // menor ou igual que 5% = minor
                    minorContributors++;
                } else { // maior que 5% = major
                    majorContributors++;
                }

                devCommitsMax = Math.max(devCommitsMax, devCommits);
                ownershipMax = Math.max(ownershipMax, ownership);

                // Calculing OEXP of each file
                Double experience = calculeDevFileExperience(changes, fileUserCommitMap, fileFile.getFileName(), devCommitter.getUser(), fileDAO, beginDate, endDate);
                ownerExperience = Math.max(experience, ownerExperience);

                Double experience2 = calculeDevFileExperience(changes2, fileUserCommitMap, fileFile.getFileName2(), devCommitter.getUser(), fileDAO, beginDate, endDate);
                ownerExperience2 = Math.max(experience2, ownerExperience2);

                // Calculing OWN
                Double cumulativeExperience = calculeDevFileExperience(cummulativeChanges, fileUserCommitMap, fileFile.getFileName(), devCommitter.getUser(), fileDAO, null, endDate);
                cummulativeOwnerExperience = Math.max(cummulativeOwnerExperience, cumulativeExperience);

                Double cumulativeExperience2 = calculeDevFileExperience(cummulativeChanges2, fileUserCommitMap, fileFile.getFileName2(), devCommitter.getUser(), fileDAO, null, endDate);
                cummulativeOwnerExperience2 = Math.max(cummulativeOwnerExperience2, cumulativeExperience2);

            }

            devCommitsAvg = (double) devCommitsSum / (double) committers;
            ownershipAvg = (double) ownershipSum / (double) committers;

//            double majorContributorsRate = (double) majorContributors / (double) committers; // % de major
//            double minorContributorsRate = (double) minorContributors / (double) committers; // % de minor

            Long updates = pairFileDAO.calculeNumberOfPullRequest(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate, true);

            Long futureUpdates;
            if (beginDate.equals(futureBeginDate) && endDate.equals(futureEndDate)) {
                futureUpdates = updates;
            } else {
                futureUpdates = pairFileDAO.calculeNumberOfPullRequest(repository,
                        fileFile.getFileName(), fileFile.getFileName2(),
                        futureBeginDate, futureEndDate, true);
            }

            // list all issues and its comments
            List<AuxWordiness> issuesAndComments = pairFileDAO.listIssues(repository,
                    fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate, true);

            long wordiness = 0;
            for (AuxWordiness auxWordiness : issuesAndComments) {
                wordiness += WordinessCalculator.calcule(auxWordiness);
            }

            Long commentsSum = pairFileDAO.calculeComments(repository,
                    fileFile.getFileName(), fileFile.getFileName2(),
                    beginDate, endDate, true);

            Long codeChurn = fileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName(), beginDate, endDate);
            Long codeChurn2 = fileDAO.calculeCodeChurn(repository,
                    fileFile.getFileName2(), beginDate, endDate);

            AuxCodeChurn pairFileCodeChurn = pairFileDAO.calculeCodeChurnAddDelChange(repository,
                    fileFile.getFileName2(), fileFile.getFileName(),
                    beginDate, endDate);

            double codeChurnAvg = (codeChurn + codeChurn2) / 2.0d;

            closenessSum = MathUtils.zeroIfNaN(closenessSum);
            closenessAvg = MathUtils.zeroIfNaN(closenessAvg);
            closenessMax = MathUtils.zeroIfNaN(closenessMax);

            // pair file age in release interval (days)
            int ageRelease = pairFileDAO.calculePairFileDaysAge(repository, fileFile.getFileName(), fileFile.getFileName2(), beginDate, endDate, true);

            // pair file age in total until final date (days)
            int ageTotal = pairFileDAO.calculePairFileDaysAge(repository, fileFile.getFileName(), fileFile.getFileName2(), null, endDate, true);

            boolean samePackage = PathUtils.isSameFullPath(fileFile.getFileName(), fileFile.getFileName2());

            AuxFileFileMetrics auxFileFileMetrics = new AuxFileFileMetrics(
                    fileFile.getFileName(), fileFile.getFileName2(), BooleanUtils.toInteger(samePackage),
                    //                        barycenterSum, barycenterAvg, barycenterMax,
                    betweennessSum, betweennessAvg, betweennessMax,
                    closenessSum, closenessAvg, closenessMax,
                    degreeSum, degreeAvg, degreeMax,
                    eigenvectorSum, eigenvectorAvg, eigenvectorMax,
View Full Code Here

TOP

Related Classes of br.edu.utfpr.cm.JGitMinerWeb.services.matrix.auxiliary.AuxFileFile

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.