| Quintiq file version 2.0 | 
| #parent: #root | 
| MethodOverride CreateIssues | 
| { | 
|   Description: 'Create `LibOpt_Issues` to highlight potential issues about values collected by this `LibOpt_StatisticTimeTotal`.' | 
|   TextBody: | 
|   [* | 
|     valuesvector := RealVector::Construct( this.ValuesAsRealVector() ); | 
|      | 
|     // Check for lower threshold violations. | 
|     booleanvector_lowerthresholdviolation := valuesvector.SmallerThan( this.LowerThreshold() ); | 
|     indexvector_lowerthresholdviolation := booleanvector_lowerthresholdviolation.AsIndexVector(); | 
|     haslowerthresholdviolations := indexvector_lowerthresholdviolation.Size() > 0; | 
|      | 
|     // Check for upper threshold violations. | 
|     booleanvector_upperthresholdviolation := valuesvector.GreaterThan( this.UpperThreshold() ); | 
|     indexvector_upperthresholdviolation := booleanvector_upperthresholdviolation.AsIndexVector(); | 
|     hasupperthresholdviolations := indexvector_upperthresholdviolation.Size() > 0; | 
|      | 
|     // Create Issues if there are violations. | 
|     if( haslowerthresholdviolations or hasupperthresholdviolations ) | 
|     { | 
|       //>> Variables needed for Issues creation. | 
|       issuetype := this.GetIssueType(); | 
|        | 
|       iterations := construct( LibOpt_Iterations ); | 
|       if( this.IsType() or this.IsRoot() ) | 
|       { | 
|         iterations := selectsortedset( this, Run.Iteration, iteration, | 
|                                        // FILTER | 
|                                        true, | 
|                                        // VALUE | 
|                                        iteration.IterationNr() | 
|                                      ); | 
|       } | 
|        | 
|       snapshotcomponents := construct( LibOpt_SnapshotComponents ); | 
|       if( this.IsComponent() ) | 
|       { | 
|         snapshotcomponents := selectsortedset( this, Component.SnapshotComponent, snapshotcomponent, | 
|                                                // FILTER | 
|                                                true, | 
|                                                // VALUE | 
|                                                snapshotcomponent.SequenceNr() | 
|                                              ); | 
|       } | 
|       //<< | 
|        | 
|       if( haslowerthresholdviolations ) | 
|       { | 
|         severityscaleentries_lowerthresholdviolation := LibOpt_Statistic::GetSeverityScaleEntriesSortedByThreshold( this.GetSeverityScaleForLowerThresholdViolation() ); | 
|          | 
|         traverse( indexvector_lowerthresholdviolation.AsValues(), Elements, index ) | 
|         { | 
|           value := valuesvector.Get( index ); | 
|            | 
|           iteration := null( LibOpt_Iteration ); | 
|           snapshot := null( LibOpt_Snapshot ); | 
|            | 
|           if( this.IsComponent() ) | 
|           { | 
|             snapshot := snapshotcomponents.Element( index ); | 
|             iteration := snapshot.GetIteration(); | 
|           } | 
|           else | 
|           { | 
|             iteration := iterations.Element( index ); | 
|             snapshot := iteration.SnapshotOwning(); | 
|           } | 
|            | 
|           // Create an Issue and link it to the relevant Snapshot. | 
|           LibOpt_Issue::Create( this, | 
|                                 snapshot, | 
|                                 issuetype, | 
|                                 this.Focus() + ', ' + Translations::LibOpt_IterationNr( iteration.IterationNr(), this.Run().TotalNrOfIterations() ), | 
|                                 this.GetSeverity( value, false /*is upper threshold violation*/, severityscaleentries_lowerthresholdviolation ), | 
|                                 this.GetIssueDetails( value ) | 
|                               ); | 
|         } | 
|       } | 
|        | 
|       if( hasupperthresholdviolations ) | 
|       { | 
|         severityscaleentries_upperthresholdviolation := LibOpt_Statistic::GetSeverityScaleEntriesSortedByThreshold( this.GetSeverityScaleForUpperThresholdViolation() ); | 
|          | 
|         traverse( indexvector_upperthresholdviolation.AsValues(), Elements, index ) | 
|         { | 
|           value := valuesvector.Get( index ); | 
|            | 
|           iteration := null( LibOpt_Iteration ); | 
|           snapshot := null( LibOpt_Snapshot ); | 
|            | 
|           if( this.IsComponent() ) | 
|           { | 
|             snapshot := snapshotcomponents.Element( index ); | 
|             iteration := snapshot.GetIteration(); | 
|           } | 
|           else | 
|           { | 
|             iteration := iterations.Element( index ); | 
|             snapshot := iteration.SnapshotOwning(); | 
|           } | 
|            | 
|           // Create an Issue and link it to the relevant Snapshot. | 
|           LibOpt_Issue::Create( this, | 
|                                 snapshot, | 
|                                 issuetype, | 
|                                 this.Focus() + ', ' + Translations::LibOpt_IterationNr( iteration.IterationNr(), this.Run().TotalNrOfIterations() ), | 
|                                 this.GetSeverity( value, true /*is upper threshold violation*/, severityscaleentries_upperthresholdviolation ), | 
|                                 this.GetIssueDetails( value ) | 
|                               ); | 
|         } | 
|       } | 
|     } | 
|   *] | 
| } |