File

src/app/experiments/experiments.component.ts

Implements

OnInit

Metadata

selector app-experiments
styleUrls ./experiments.component.css
templateUrl ./experiments.component.html

Index

Properties
Methods
Inputs
Outputs

Constructor

constructor(snackBar: MatSnackBar)
Parameters :
Name Type Optional
snackBar MatSnackBar No

Inputs

experimentConfigurationService
Type : ExperimentConfigurationService
experimentService
Type : ExperimentService
infoService
Type : InfoService
objectiveService
Type : ObjectiveService

Outputs

download
Type : EventEmitter<any>

Methods

convertToCSV
convertToCSV(objArray, headerList)
Parameters :
Name Optional
objArray No
headerList No
Returns : string
downloadFile
downloadFile(data, filename: string)
Parameters :
Name Type Optional Default value
data No
filename string No 'data'
Returns : void
downloadInfo
downloadInfo(experiment)
Parameters :
Name Optional
experiment No
Returns : void
getExecution
getExecution(exec)
Parameters :
Name Optional
exec No
Returns : any
ngOnInit
ngOnInit()
Returns : void
showInfo
showInfo(experiment)
Parameters :
Name Optional
experiment No
Returns : void

Properties

columnsToDisplay
Type : []
Default value : ['id', 'name', 'algorithm', 'createdAt']
expandedElement
Type : any | null
experiments
Type : []
Default value : []
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {animate, state, style, transition, trigger} from "@angular/animations";
import {OptimizationService} from "../services/optimization.service";
import {MatSnackBar} from "@angular/material/snack-bar";
import {ExperimentService} from "../services/experiment.service";
import {ExperimentConfigurationService} from "../services/experiment-configuration.service";
import {ObjectiveService} from "../services/objective.service";
import {InfoService} from "../services/info.service";
import {map} from "rxjs/operators";

@Component({
  selector: 'app-experiments',
  templateUrl: './experiments.component.html',
  animations: [
    trigger('detailExpand', [
      state('collapsed', style({height: '0px', minHeight: '0'})),
      state('expanded', style({height: '*'})),
      transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
    ]),
  ],
  styleUrls: ['./experiments.component.css']
})
export class ExperimentsComponent implements OnInit {

  experiments = [];
  @Output() download: EventEmitter<any> = new EventEmitter<any>();
  @Input() experimentService: ExperimentService;
  @Input() objectiveService: ObjectiveService;
  @Input() infoService: InfoService;
  @Input() experimentConfigurationService: ExperimentConfigurationService;
  columnsToDisplay = ['id', 'name', 'algorithm', 'createdAt'];
  expandedElement: any | null;

  constructor(private snackBar: MatSnackBar) {

  }

  ngOnInit() {
    this.experimentService.getAll().subscribe(experiments => {
      this.experiments = experiments.values;
    });

    OptimizationService.onOptimizationInfo.asObservable().subscribe(value => {
      if (value && value.status === "COMPLETE") {
        this.experimentService.getAll().subscribe(experiments => {
          this.experiments = experiments.values;
        });
      }
    });
  }

  getExecution(exec) {
    return exec != null ? exec.id : null;
  }

  showInfo(experiment) {
    experiment.experimentConfiguration = this.experimentConfigurationService.findByExperiment(experiment.id);
    experiment.objective = this.objectiveService.findByExperiment(experiment.id);
    experiment.info = this.infoService.findByExperiment(experiment.id).pipe(map(v => {
      let values = [];
      let lastExecution = null;
      let executionId = -1;
      for (let value of v.values) {
        if (lastExecution != this.getExecution(value.execution)) {
          executionId++;
        }
        values[executionId] = values[executionId] || [];
        values[executionId].push(value);
        lastExecution = this.getExecution(value.execution);
      }
      v.values = values;
      return v;
    }));
  }


  downloadInfo(experiment) {
    this.infoService.findByExperiment(experiment.id).subscribe(info => {
      var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(info));
      var downloadAnchorNode = document.createElement('a');
      downloadAnchorNode.setAttribute("href", dataStr);
      downloadAnchorNode.setAttribute("download", experiment.id + ".info.json");
      document.body.appendChild(downloadAnchorNode); // required for firefox
      downloadAnchorNode.click();
      downloadAnchorNode.remove();
    })
  }

  downloadFile(data, filename = 'data') {
    let csvData = this.convertToCSV(data, ['name', 'age', 'average', 'approved', 'description']);
    let blob = new Blob(['\ufeff' + csvData], {type: 'text/csv;charset=utf-8;'});
    let dwldLink = document.createElement("a");
    let url = URL.createObjectURL(blob);
    let isSafariBrowser = navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1;
    if (isSafariBrowser) {  //if Safari open in new window to save file with random filename.
      dwldLink.setAttribute("target", "_blank");
    }
    dwldLink.setAttribute("href", url);
    dwldLink.setAttribute("download", filename + ".csv");
    dwldLink.style.visibility = "hidden";
    document.body.appendChild(dwldLink);
    dwldLink.click();
    document.body.removeChild(dwldLink);
  }

  convertToCSV(objArray, headerList) {
    let array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    let str = '';
    let row = 'S.No,';
    for (let index in headerList) {
      row += headerList[index] + ',';
    }
    row = row.slice(0, -1);
    str += row + '\r\n';
    for (let i = 0; i < array.length; i++) {
      let line = (i + 1) + '';
      for (let index in headerList) {
        let head = headerList[index];
        line += ',' + array[i][head];
      }
      str += line + '\r\n';
    }
    return str;
  }

}
<opla-grid-list>
  <opla-grid-title style="width: 100%">
    <table mat-table
           [dataSource]="experiments" multiTemplateDataRows
           class="mat-elevation-z8">
      <ng-container matColumnDef="{{column}}" *ngFor="let column of columnsToDisplay">
        <th mat-header-cell *matHeaderCellDef> {{column | titlecase}}</th>
        <td mat-cell *matCellDef="let element" style="border: 0"> {{element[column]}} </td>
      </ng-container>

      <ng-container matColumnDef="expandedDetail">
        <td mat-cell *matCellDef="let element;" [attr.colspan]="columnsToDisplay.length">
          <div [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'" style="overflow: hidden">
            <div class="table-column-element-detail">
              <div class="table-column-element-diagram">
                <div class="example-element-position"> {{element.id}} </div>
                <div class="table-column-element-symbol"> {{element.name}} </div>
                <div class="example-element-name"> {{element.algorithm}} </div>
                <div class="example-element-weight"> {{element.createdAt}} </div>
              </div>
              <div class="table-column-element-description">
                <button mat-icon-button color="primary" aria-label="Download PLA alternatives"
                        (click)="download.emit(element.hash)">
                  <mat-icon>get_app</mat-icon>
                </button>
                <button mat-icon-button color="primary" aria-label="Download Info Json" (click)="downloadInfo(element)">
                  <mat-icon>description</mat-icon>
                </button>
                <br>
                <div class="pla-info"
                     *ngFor="let experimentConfiguration of (element.experimentConfiguration | async)?.values">
                  <div>
                    Number of Runs: {{experimentConfiguration.numberOfRuns}}
                  </div>
                  <div>
                    Max Evaluations: {{experimentConfiguration.maxEvaluations}}
                  </div>
                  <div>
                    Crossover Probability: {{experimentConfiguration.crossoverProb}}
                  </div>
                  <div>
                    Mutation Probability: {{experimentConfiguration.mutationProb}}
                  </div>
                  <div>
                    Objective Functions: {{experimentConfiguration.objectives}}
                  </div>
                  <div>
                    Mutation Operators: {{experimentConfiguration.mutationOperators | replaceall:'Mutation':''}}
                  </div>
                  <div>
                    Population Size: {{experimentConfiguration.populationSize}}
                  </div>
                  <br>
                </div>
              </div>
            </div>
            <div>
              <h2>Solutions:</h2>
              <div *ngFor="let executions of (element.info | async)?.values; let i = index">
                <div *ngIf="executions[0].execution"><h3>Execution {{i + 1}}</h3></div>
                <div *ngIf="!executions[0].execution"><h3>Non-dominated solutions after {{i}} executions</h3></div>
                <opla-grid-list>
                  <opla-grid-tile *ngFor="let info of executions; let j = index" style="max-width: 250px; margin-bottom: 10px;">
                    <mat-card>
                      <mat-card-content>
                        <span [matBadge]="info.isAll ? '*' : null"
                              matBadgeOverlap="false"> {{info.name | replaceall:'INFO_':''}} </span>
                        <br><br>
                        <b>Nr. Packages:</b> {{info.numberOfPackages || 0}}<br>
                        <b>Nr. Classes:</b> {{info.numberOfClasses || 0}}<br>
                        <b>Nr. Variabilities:</b> {{info.numberOfVariabilities || 0}}<br>
                        <b>Nr. Interfaces:</b> {{info.numberOfInterfaces || 0}}<br>
                        <b>Nr. Dependencies:</b> {{info.numberOfDependencies || 0}}<br>
                        <b>Nr. Abstractions:</b> {{info.numberOfAbstractions || 0}}<br>
                        <b>Nr. Generalizations:</b> {{info.numberOfGeneralizations || 0}}<br>
                        <b>Nr. Associations:</b> {{info.numberOfAssociations || 0}}<br>
                        <b>User Evaluation:</b> {{info.userEvaluation || 0}}<br>
                        <b>Freezed Elements:</b> {{info.freezedElements}}<br>
                        <b>Objective Values:</b> {{info.objectives}}<br>
                      </mat-card-content>
                    </mat-card>
                  </opla-grid-tile>
                </opla-grid-list>
                <br>
                <!--                <div>-->

                <!--                </div>-->
              </div>
            </div>
          </div>
        </td>
      </ng-container>

      <tr mat-header-row *matHeaderRowDef="columnsToDisplay"></tr>
      <tr mat-row *matRowDef="let element; columns: columnsToDisplay; "
          class="element-row"
          [class.example-expanded-row]="expandedElement === element"
          (click)="expandedElement = expandedElement === element ? null : element; showInfo(element);">
      </tr>
      <tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row"></tr>
    </table>

  </opla-grid-title>
</opla-grid-list>

./experiments.component.css

.pla-info > div {
  border-bottom: 1px dashed #e8e8e8;
  padding: 5px;
}
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""