1111import weka .core .Instances ;
1212import weka .core .converters .ArffLoader ;
1313import weka .filters .Filter ;
14+ import weka .filters .unsupervised .attribute .Remove ;
1415
1516import java .io .File ;
1617import java .io .IOException ;
@@ -36,27 +37,39 @@ public void createFeatures() {
3637
3738 //Create and set attributes for the train instances
3839 if (options .getArffInstancesFiles ().isEmpty ()) {
39- ArrayList <Attribute > trainAttributes = createAttributes (getCategories (options .getAllClasses ()), dataset .getTrainMethods (), featureSets );
40+ ArrayList <Attribute > trainAttributes = createAttributes (getCategories (options .getAllClasses ()), dataset .getTrainMethods ());
4041 structure = new Instances ("swan-srm" , trainAttributes , 0 );
41- convertToMekaInstances (structure );
4242
4343 Set <Method > methods = new HashSet <>(dataset .getTrainMethods ());
4444 methods .addAll (dataset .getTestMethods ());
4545
4646 evaluateFeatureData (methods );
47- trainInstances = createInstances (structure , trainAttributes , dataset .getTrainMethods (), getCategories (options .getAllClasses ()));
47+ trainInstances = createInstances (new Instances ( structure ) , trainAttributes , dataset .getTrainMethods (), getCategories (options .getAllClasses ()));
4848 } else {
4949 ArffLoader loader = new ArffLoader ();
5050
5151 try {
5252 loader .setSource (new File (options .getArffInstancesFiles ().get (0 )));
53+
5354 trainInstances = loader .getDataSet ();
5455 structure = loader .getStructure ();
56+
57+ //append remaining instances
58+ if (options .getArffInstancesFiles ().size () > 1 ) {
59+ for (int x = 1 ; x < options .getArffInstancesFiles ().size (); x ++) {
60+
61+ ArffLoader arffLoader = new ArffLoader ();
62+ arffLoader .setSource (new File (options .getArffInstancesFiles ().get (x )));
63+
64+ trainInstances = mergeInstances (trainInstances , arffLoader .getDataSet ());
65+ structure = mergeInstances (structure , arffLoader .getStructure ());
66+ }
67+ }
5568 } catch (IOException e ) {
5669 e .printStackTrace ();
5770 }
5871
59- createAttributes (getCategories (options .getAllClasses ()), dataset .getTestMethods (), featureSets );
72+ createAttributes (getCategories (options .getAllClasses ()), dataset .getTestMethods ());
6073 evaluateFeatureData (dataset .getTestMethods ());
6174 }
6275 testInstances = createTestSet ();
@@ -65,24 +78,61 @@ public void createFeatures() {
6578 this .instances .put ("test" , convertToMekaInstances (testInstances ));
6679 }
6780
81+ /**
82+ * Merge two instances into one instances object.
83+ * @param first instances
84+ * @param second instances
85+ * @return merged instances
86+ */
87+ public Instances mergeInstances (Instances first , Instances second ) {
88+
89+ for (int c = 0 ; c < 12 ; c ++) {
90+ second .renameAttribute (second .attribute (c ), "b_" + second .attribute (c ).name ());
91+ }
92+
93+ Instances instances = Instances .mergeInstances (first , second );
94+
95+ ArrayList <Integer > indices = new ArrayList <>();
96+
97+ for (int att = 0 ; att < instances .numAttributes (); att ++) {
98+ if (instances .attribute (att ).name ().startsWith ("b_" )) {
99+ indices .add (att );
100+ }
101+ }
102+
103+ Remove removeFilter = new Remove ();
104+ removeFilter .setAttributeIndicesArray (indices .stream ().mapToInt (i -> i ).toArray ());
105+ removeFilter .setInvertSelection (false );
106+
107+ try {
108+ removeFilter .setInputFormat (instances );
109+ instances = Filter .useFilter (instances , removeFilter );
110+
111+ } catch (Exception e ) {
112+ e .printStackTrace ();
113+ }
114+
115+ return instances ;
116+ }
117+
68118 public Instances createTestSet () {
69119
120+ Instances testInstances = new Instances (structure );
70121 //Create and set attributes for the test instances.
71122 Attribute idAttr = new Attribute ("id" , dataset .getTestMethods ().stream ().map (Method ::getArffSafeSignature ).collect (Collectors .toList ()));
72- structure .replaceAttributeAt (idAttr , structure .attribute ("id" ).index ());
73- ArrayList <Attribute > aList = Collections .list (structure .enumerateAttributes ());
123+ testInstances .replaceAttributeAt (idAttr , testInstances .attribute ("id" ).index ());
124+ ArrayList <Attribute > aList = Collections .list (testInstances .enumerateAttributes ());
74125
75- return createInstances (structure , aList , dataset .getTestMethods (), getCategories (options .getAllClasses ()));
126+ return createInstances (testInstances , aList , dataset .getTestMethods (), getCategories (options .getAllClasses ()));
76127 }
77128
78129 /**
79130 * Creates instances and adds attributes for the features, classes, and method signatures.
80131 *
81- * @param categories list of categories
82- * @param methods list of training methods
83- * @param featureSets classification mode
132+ * @param categories list of categories
133+ * @param methods list of training methods
84134 */
85- public ArrayList <Attribute > createAttributes (Set <Category > categories , Set <Method > methods , List < FeatureSet . Type > featureSets ) {
135+ public ArrayList <Attribute > createAttributes (Set <Category > categories , Set <Method > methods ) {
86136
87137 ArrayList <Attribute > attributes = new ArrayList <>();
88138
@@ -107,7 +157,7 @@ public Instances convertToMekaInstances(Instances instances) {
107157 output = Filter .useFilter (instances , filter );
108158 output .setRelationName ("swan-srm:" + output .relationName ());
109159
110- Util .exportInstancesToArff (output );
160+ Util .exportInstancesToArff (output , "meka" );
111161 } catch (Exception e ) {
112162 e .printStackTrace ();
113163 }
0 commit comments