PerfExplorer 2.0

edu.uoregon.tau.perfexplorer.glue
Class AbstractResult

Object
  extended by AbstractResult
All Implemented Interfaces:
PerformanceResult, Serializable
Direct Known Subclasses:
DataSourceResult, DefaultResult, ScalabilityResult, TrialMeanResult, TrialResult, TrialThreadMetadata, TrialTotalResult

public abstract class AbstractResult
extends Object
implements PerformanceResult, Serializable

This class is used as an abstract implementation of the PerformanceResult interface. This class has all the member data fields for the plethora of anticipated subclasses.

CVS $Id: AbstractResult.java,v 1.20 2010/01/11 17:25:35 khuck Exp $

Since:
2.0
Version:
2.0
Author:
Kevin Huck
See Also:
Serialized Form

Field Summary
static int CALLS
           
static int EXCLUSIVE
           
static int INCLUSIVE
           
static int SUBROUTINES
           
static int USEREVENT_MAX
           
static int USEREVENT_MEAN
           
static int USEREVENT_MIN
           
static int USEREVENT_NUMEVENTS
           
static int USEREVENT_SUMSQR
           
 
Constructor Summary
AbstractResult(PerformanceResult input)
          copy constructor
AbstractResult(PerformanceResult input, boolean fullCopy)
          sort-of copy constructor
 
Method Summary
 double getCalls(Integer thread, String event)
          This method will return the number of times that the specified event was called on the specified thread of execution.
 double getDataPoint(Integer thread, String event, String metric, int type)
          This method will return the value stored in the trial for the specified thread, event, metric, type combination.
 DataSource getDataSource()
          This method returns the DataSource to which the performance data is related.
 Map<Integer,String> getEventMap()
          Get a Map of events in this result.
 Set<String> getEvents()
          This method will return a Set of Strings, which represent the names of the events in the trial.
 double getExclusive(Integer thread, String event, String metric)
          This method will return the exclusive value stored in the trial for the selected thread, event, metric combination.
 String getFPMetric()
          This method returns the metric name which represents floating point operations.
 double getInclusive(Integer thread, String event, String metric)
          This method will return the inclusive value stored in the trial for the selected thread, event, metric combination.
 String getL1AccessMetric()
          This method returns the metric name which represents L1 cache accesses.
 String getL1MissMetric()
          This method returns the metric name which represents the L1 cache misses.
 String getL2AccessMetric()
          This method returns the metric name which represents L2 cache accesses.
 String getL2MissMetric()
          This method returns the metric name which represents the L2 cache misses.
 String getL3AccessMetric()
          This method returns the metric name which represents L3 cache accesses.
 String getL3MissMetric()
          This method returns the metric name which represents the L3 cache misses.
 String getMainEvent()
          This method will return the name of the event which has the highest inclusive time value in the trial.
 double getMainInclusive()
           
 Set<String> getMetrics()
          This method will return a Set of Strings, which represent the names of the metrics in the trial.
 String getName()
          Get the name for this input.
 Integer getOriginalThreads()
          This method will return the number of threads in the trial from which this data was derived.
 Map<String,Double> getSortedByValue(String metric, int type, boolean ascending)
          This method will return a Map of values, sorted by the values.
 double getSubroutines(Integer thread, String event)
          This method will return the number of subroutines that the specified event had on the specified thread of execution.
 Set<Integer> getThreads()
          This method will return a Set of Integers, which represent the identifiers of the threads of execution in the trial.
 String getTimeMetric()
          This method will return the metric which represents the time metric in the trial.
 String getTLBMissMetric()
          This method returns the metric name which represents the TLB misses.
 String getTotalInstructionMetric()
          This method returns the metric name which represents the total number of instructions.
 Trial getTrial()
          This method returns the Trial to which the performance data is related.
 Integer getTrialID()
          This method returns the ID of the Trial to which the performance data is related.
static List<Integer> getTypes()
           
static List<Integer> getTypes(boolean includeUserEventTypes)
           
 double getUsereventMax(Integer thread, String event)
          This method will return the maximum value for the specified user event which was observed on the specified thread of execution.
 double getUsereventMean(Integer thread, String event)
          This method will return the mean value for the specified user event which was observed on the specified thread of execution.
 double getUsereventMin(Integer thread, String event)
          This method will return the minimum value for the specified user event which was observed on the specified thread of execution.
 double getUsereventNumevents(Integer thread, String event)
          This method will return the number of times that a specified user event happened on the specified thread of execution.
 Set<String> getUserEvents()
          This method will return a Set of Strings, which represent the names of the userevents in the trial.
 Set<String> getUserEvents(Integer thread)
          This method will return a Set of Strings, which represent the names of the userevents for the specified thread in the trial.
 double getUsereventSumsqr(Integer thread, String event)
          This method will return the sum of squared values for the specified user event which was observed on the specified thread of execution.
 void putCalls(Integer thread, String event, double value)
          This method will save the specified value as the number of calls for the specified event on the specified thread of execution.
 void putDataPoint(Integer thread, String event, String metric, int type, double value)
          This method will store the specified value in the trial for the specified thread, event, metric, type combination.
 void putExclusive(Integer thread, String event, String metric, double value)
          This method will save the specified value as the exclusive value for the specified thread, event, metric combination.
 void putInclusive(Integer thread, String event, String metric, double value)
          This method will save the specified value as the inclusive value for the specified thread, event, metric combination.
 void putSubroutines(Integer thread, String event, double value)
          This method will save the specified value as the number of subroutines for the specified event on the specified thread of execution.
 void putUsereventMax(Integer thread, String event, double value)
          This method will save the maximum value for a specified user event which was observed on the specified thread of execution.
 void putUsereventMean(Integer thread, String event, double value)
          This method will save the mean value for a specified user event which was observed on the specified thread of execution.
 void putUsereventMin(Integer thread, String event, double value)
          This method will save the minimum value for a specified user event which was observed on the specified thread of execution.
 void putUsereventNumevents(Integer thread, String event, double value)
          This method will save the number of times that a specified user event happened on the specified thread of execution.
 void putUsereventSumsqr(Integer thread, String event, double value)
          This method will save the sum of squared values for the specified user event which was observed on the specified thread of execution.
 void setEventMap(Map<Integer,String> eventMap)
          Set the Map of events in this result.
 void setIgnoreWarnings(boolean ignore)
          When values are requested from the trial, ignore warnings if the values are null
 void setMainInclusive(double mainInclusive)
           
 void setName(String name)
          Set the name for this input.
 void setOriginalThreads(Integer originalThreads)
           
 void setTrial(Trial trial)
           
 void setTrialID(Integer trialID)
           
 String toString()
          This method will return a string representation of this PerformanceResult.
static String typeToString(int type)
           
 void updateEventMap()
          update the event map - remove what's missing, essentially
 
Methods inherited from class Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

CALLS

public static final int CALLS
See Also:
Constant Field Values

EXCLUSIVE

public static final int EXCLUSIVE
See Also:
Constant Field Values

INCLUSIVE

public static final int INCLUSIVE
See Also:
Constant Field Values

SUBROUTINES

public static final int SUBROUTINES
See Also:
Constant Field Values

USEREVENT_MAX

public static final int USEREVENT_MAX
See Also:
Constant Field Values

USEREVENT_MEAN

public static final int USEREVENT_MEAN
See Also:
Constant Field Values

USEREVENT_MIN

public static final int USEREVENT_MIN
See Also:
Constant Field Values

USEREVENT_NUMEVENTS

public static final int USEREVENT_NUMEVENTS
See Also:
Constant Field Values

USEREVENT_SUMSQR

public static final int USEREVENT_SUMSQR
See Also:
Constant Field Values
Constructor Detail

AbstractResult

public AbstractResult(PerformanceResult input)
copy constructor


AbstractResult

public AbstractResult(PerformanceResult input,
                      boolean fullCopy)
sort-of copy constructor

Method Detail

getCalls

public double getCalls(Integer thread,
                       String event)
Description copied from interface: PerformanceResult
This method will return the number of times that the specified event was called on the specified thread of execution.

Specified by:
getCalls in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the number of calls

getDataPoint

public double getDataPoint(Integer thread,
                           String event,
                           String metric,
                           int type)
Description copied from interface: PerformanceResult
This method will return the value stored in the trial for the specified thread, event, metric, type combination.

Specified by:
getDataPoint in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
type - The type of data to return
Returns:
the value The value of that type measured on that thread, event, metric combination
See Also:
PerformanceResult.getExclusive(java.lang.Integer, java.lang.String, java.lang.String), PerformanceResult.getInclusive(java.lang.Integer, java.lang.String, java.lang.String), PerformanceResult.getCalls(java.lang.Integer, java.lang.String), PerformanceResult.getSubroutines(java.lang.Integer, java.lang.String), INCLUSIVE, EXCLUSIVE, CALLS, SUBROUTINES, USEREVENT_NUMEVENTS, USEREVENT_MAX, USEREVENT_MIN, USEREVENT_MEAN, USEREVENT_SUMSQR

getDataSource

public DataSource getDataSource()
Description copied from interface: PerformanceResult
This method returns the DataSource to which the performance data is related.

Specified by:
getDataSource in interface PerformanceResult
Returns:
the DataSource

getEventMap

public Map<Integer,String> getEventMap()
Description copied from interface: PerformanceResult
Get a Map of events in this result.

Specified by:
getEventMap in interface PerformanceResult
Returns:
the eventMap
See Also:
Map

getEvents

public Set<String> getEvents()
Description copied from interface: PerformanceResult
This method will return a Set of Strings, which represent the names of the events in the trial.

Specified by:
getEvents in interface PerformanceResult
Returns:
the set of event names

getExclusive

public double getExclusive(Integer thread,
                           String event,
                           String metric)
Description copied from interface: PerformanceResult
This method will return the exclusive value stored in the trial for the selected thread, event, metric combination.

Specified by:
getExclusive in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
Returns:
the exclusive value

getFPMetric

public String getFPMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents floating point operations.

Specified by:
getFPMetric in interface PerformanceResult
Returns:
the metric name

getInclusive

public double getInclusive(Integer thread,
                           String event,
                           String metric)
Description copied from interface: PerformanceResult
This method will return the inclusive value stored in the trial for the selected thread, event, metric combination.

Specified by:
getInclusive in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
Returns:
the inclusive value

getL1AccessMetric

public String getL1AccessMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents L1 cache accesses.

Specified by:
getL1AccessMetric in interface PerformanceResult
Returns:
the metric name

getL1MissMetric

public String getL1MissMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents the L1 cache misses.

Specified by:
getL1MissMetric in interface PerformanceResult
Returns:
the metric name

getL2AccessMetric

public String getL2AccessMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents L2 cache accesses.

Specified by:
getL2AccessMetric in interface PerformanceResult
Returns:
the metric name

getL2MissMetric

public String getL2MissMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents the L2 cache misses.

Specified by:
getL2MissMetric in interface PerformanceResult
Returns:
the metric name

getL3AccessMetric

public String getL3AccessMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents L3 cache accesses.

Specified by:
getL3AccessMetric in interface PerformanceResult
Returns:
the metric name

getL3MissMetric

public String getL3MissMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents the L3 cache misses.

Specified by:
getL3MissMetric in interface PerformanceResult
Returns:
the metric name

getMainEvent

public String getMainEvent()
Description copied from interface: PerformanceResult
This method will return the name of the event which has the highest inclusive time value in the trial.

Specified by:
getMainEvent in interface PerformanceResult
Returns:
the name of the main event

getMainInclusive

public double getMainInclusive()
Returns:
the mainInclusive

getMetrics

public Set<String> getMetrics()
Description copied from interface: PerformanceResult
This method will return a Set of Strings, which represent the names of the metrics in the trial.

Specified by:
getMetrics in interface PerformanceResult
Returns:
the set of metric names

getName

public String getName()
Description copied from interface: PerformanceResult
Get the name for this input.

Specified by:
getName in interface PerformanceResult
Returns:
the name

getOriginalThreads

public Integer getOriginalThreads()
Description copied from interface: PerformanceResult
This method will return the number of threads in the trial from which this data was derived.

Specified by:
getOriginalThreads in interface PerformanceResult
Returns:
the originalThreads

getSortedByValue

public Map<String,Double> getSortedByValue(String metric,
                                           int type,
                                           boolean ascending)
Description copied from interface: PerformanceResult
This method will return a Map of values, sorted by the values. The keys to the map are the event strings in the trial.

Specified by:
getSortedByValue in interface PerformanceResult
Parameters:
metric - The metric of interest
type - The type of data
ascending - Either ascending (true) or descending (false) order
Returns:
the Map of values
See Also:
INCLUSIVE, EXCLUSIVE, CALLS, SUBROUTINES, USEREVENT_NUMEVENTS, USEREVENT_MAX, USEREVENT_MIN, USEREVENT_MEAN, USEREVENT_SUMSQR

getSubroutines

public double getSubroutines(Integer thread,
                             String event)
Description copied from interface: PerformanceResult
This method will return the number of subroutines that the specified event had on the specified thread of execution.

Specified by:
getSubroutines in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the number of subroutines

getThreads

public Set<Integer> getThreads()
Description copied from interface: PerformanceResult
This method will return a Set of Integers, which represent the identifiers of the threads of execution in the trial.

Specified by:
getThreads in interface PerformanceResult
Returns:
the set of thread identifiers

getTimeMetric

public String getTimeMetric()
Description copied from interface: PerformanceResult
This method will return the metric which represents the time metric in the trial.

Specified by:
getTimeMetric in interface PerformanceResult
Returns:
the metric name

getTLBMissMetric

public String getTLBMissMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents the TLB misses.

Specified by:
getTLBMissMetric in interface PerformanceResult
Returns:
the metric name

getTotalInstructionMetric

public String getTotalInstructionMetric()
Description copied from interface: PerformanceResult
This method returns the metric name which represents the total number of instructions.

Specified by:
getTotalInstructionMetric in interface PerformanceResult
Returns:
the metric name

getTrial

public Trial getTrial()
Description copied from interface: PerformanceResult
This method returns the Trial to which the performance data is related.

Specified by:
getTrial in interface PerformanceResult
Returns:
the Trial

getTrialID

public Integer getTrialID()
Description copied from interface: PerformanceResult
This method returns the ID of the Trial to which the performance data is related.

Specified by:
getTrialID in interface PerformanceResult
Returns:
the trial's ID

getTypes

public static List<Integer> getTypes()

getTypes

public static List<Integer> getTypes(boolean includeUserEventTypes)

getUsereventMax

public double getUsereventMax(Integer thread,
                              String event)
Description copied from interface: PerformanceResult
This method will return the maximum value for the specified user event which was observed on the specified thread of execution.

Specified by:
getUsereventMax in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the maximum value

getUsereventMean

public double getUsereventMean(Integer thread,
                               String event)
Description copied from interface: PerformanceResult
This method will return the mean value for the specified user event which was observed on the specified thread of execution.

Specified by:
getUsereventMean in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the mean value

getUsereventMin

public double getUsereventMin(Integer thread,
                              String event)
Description copied from interface: PerformanceResult
This method will return the minimum value for the specified user event which was observed on the specified thread of execution.

Specified by:
getUsereventMin in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the minimum value

getUsereventNumevents

public double getUsereventNumevents(Integer thread,
                                    String event)
Description copied from interface: PerformanceResult
This method will return the number of times that a specified user event happened on the specified thread of execution.

Specified by:
getUsereventNumevents in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the number of events

getUserEvents

public Set<String> getUserEvents()
Description copied from interface: PerformanceResult
This method will return a Set of Strings, which represent the names of the userevents in the trial.

Specified by:
getUserEvents in interface PerformanceResult
Returns:
the set of userevent names

getUserEvents

public Set<String> getUserEvents(Integer thread)
Description copied from interface: PerformanceResult
This method will return a Set of Strings, which represent the names of the userevents for the specified thread in the trial.

Specified by:
getUserEvents in interface PerformanceResult
Returns:
the set of userevent names

getUsereventSumsqr

public double getUsereventSumsqr(Integer thread,
                                 String event)
Description copied from interface: PerformanceResult
This method will return the sum of squared values for the specified user event which was observed on the specified thread of execution.

Specified by:
getUsereventSumsqr in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
Returns:
the sum of squared values

putCalls

public void putCalls(Integer thread,
                     String event,
                     double value)
Description copied from interface: PerformanceResult
This method will save the specified value as the number of calls for the specified event on the specified thread of execution.

Specified by:
putCalls in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The value measured on that thread, event combination

putDataPoint

public void putDataPoint(Integer thread,
                         String event,
                         String metric,
                         int type,
                         double value)
Description copied from interface: PerformanceResult
This method will store the specified value in the trial for the specified thread, event, metric, type combination.

Specified by:
putDataPoint in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
type - The type of data to return
value - The value The value of that type measured on that thread, event, metric combination
See Also:
PerformanceResult.putExclusive(java.lang.Integer, java.lang.String, java.lang.String, double), PerformanceResult.putInclusive(java.lang.Integer, java.lang.String, java.lang.String, double), PerformanceResult.putCalls(java.lang.Integer, java.lang.String, double), PerformanceResult.putSubroutines(java.lang.Integer, java.lang.String, double), INCLUSIVE, EXCLUSIVE, CALLS, SUBROUTINES, USEREVENT_NUMEVENTS, USEREVENT_MAX, USEREVENT_MIN, USEREVENT_MEAN, USEREVENT_SUMSQR

putExclusive

public void putExclusive(Integer thread,
                         String event,
                         String metric,
                         double value)
Description copied from interface: PerformanceResult
This method will save the specified value as the exclusive value for the specified thread, event, metric combination.

Specified by:
putExclusive in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
value - The value measured on that thread, event, metric combination

putInclusive

public void putInclusive(Integer thread,
                         String event,
                         String metric,
                         double value)
Description copied from interface: PerformanceResult
This method will save the specified value as the inclusive value for the specified thread, event, metric combination.

Specified by:
putInclusive in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
metric - The metric of interest
value - The value measured on that thread, event, metric combination

putSubroutines

public void putSubroutines(Integer thread,
                           String event,
                           double value)
Description copied from interface: PerformanceResult
This method will save the specified value as the number of subroutines for the specified event on the specified thread of execution.

Specified by:
putSubroutines in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The value measured on that thread, event combination

putUsereventMax

public void putUsereventMax(Integer thread,
                            String event,
                            double value)
Description copied from interface: PerformanceResult
This method will save the maximum value for a specified user event which was observed on the specified thread of execution.

Specified by:
putUsereventMax in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The maximum value

putUsereventMean

public void putUsereventMean(Integer thread,
                             String event,
                             double value)
Description copied from interface: PerformanceResult
This method will save the mean value for a specified user event which was observed on the specified thread of execution.

Specified by:
putUsereventMean in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The mean value

putUsereventMin

public void putUsereventMin(Integer thread,
                            String event,
                            double value)
Description copied from interface: PerformanceResult
This method will save the minimum value for a specified user event which was observed on the specified thread of execution.

Specified by:
putUsereventMin in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The minimum value

putUsereventNumevents

public void putUsereventNumevents(Integer thread,
                                  String event,
                                  double value)
Description copied from interface: PerformanceResult
This method will save the number of times that a specified user event happened on the specified thread of execution.

Specified by:
putUsereventNumevents in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The number of events

putUsereventSumsqr

public void putUsereventSumsqr(Integer thread,
                               String event,
                               double value)
Description copied from interface: PerformanceResult
This method will save the sum of squared values for the specified user event which was observed on the specified thread of execution.

Specified by:
putUsereventSumsqr in interface PerformanceResult
Parameters:
thread - The thread of interest
event - The event of interest
value - The sum of squared values

setEventMap

public void setEventMap(Map<Integer,String> eventMap)
Description copied from interface: PerformanceResult
Set the Map of events in this result.

Specified by:
setEventMap in interface PerformanceResult
Parameters:
eventMap - the eventMap to set
See Also:
Map

setIgnoreWarnings

public void setIgnoreWarnings(boolean ignore)
Description copied from interface: PerformanceResult
When values are requested from the trial, ignore warnings if the values are null

Specified by:
setIgnoreWarnings in interface PerformanceResult

setMainInclusive

public void setMainInclusive(double mainInclusive)
Parameters:
mainInclusive - the mainInclusive to set

setName

public void setName(String name)
Description copied from interface: PerformanceResult
Set the name for this input.

Specified by:
setName in interface PerformanceResult
Parameters:
name - the name to set

setOriginalThreads

public void setOriginalThreads(Integer originalThreads)
Parameters:
originalThreads - the originalThreads to set

setTrial

public void setTrial(Trial trial)

setTrialID

public void setTrialID(Integer trialID)

toString

public String toString()
Description copied from interface: PerformanceResult
This method will return a string representation of this PerformanceResult.

Specified by:
toString in interface PerformanceResult
Overrides:
toString in class Object
Returns:
a printable string

typeToString

public static String typeToString(int type)

updateEventMap

public void updateEventMap()
Description copied from interface: PerformanceResult
update the event map - remove what's missing, essentially

Specified by:
updateEventMap in interface PerformanceResult

PerfExplorer 2.0

****************************************************************************
Copyright 1997-2009
Department of Computer and Information Science, University of Oregon
Advanced Computing Laboratory, Los Alamos National Laboratory
Juelich Supercomputing Centre, Research Center Juelich, Germany
http://tau.uoregon.edu
****************************************************************************
Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of University of Oregon (UO) and Los Alamos National Laboratory (LANL) not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The University of Oregon and LANL makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

THE UNIVERSITY OF OREGON AND LANL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF OREGON OR LANL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.