All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tensorflow.framework.DebugOutput Maven / Gradle / Ivy

The newest version!
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: tensorflow/core/kernels/boosted_trees/boosted_trees.proto

package org.tensorflow.framework;

/**
 * 
 * DebugOutput contains outputs useful for debugging/model interpretation, at
 * the individual example-level. Debug outputs that are available to the user
 * are: 1) Directional feature contributions (DFCs) 2) Node IDs for ensemble
 * prediction path 3) Leaf node IDs.
 * 
* * Protobuf type {@code tensorflow.boosted_trees.DebugOutput} */ public final class DebugOutput extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:tensorflow.boosted_trees.DebugOutput) DebugOutputOrBuilder { private static final long serialVersionUID = 0L; // Use DebugOutput.newBuilder() to construct. private DebugOutput(com.google.protobuf.GeneratedMessageV3.Builder builder) { super(builder); } private DebugOutput() { featureIds_ = java.util.Collections.emptyList(); logitsPath_ = java.util.Collections.emptyList(); } @java.lang.Override public final com.google.protobuf.UnknownFieldSet getUnknownFields() { return this.unknownFields; } private DebugOutput( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { this(); if (extensionRegistry == null) { throw new java.lang.NullPointerException(); } int mutable_bitField0_ = 0; com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); try { boolean done = false; while (!done) { int tag = input.readTag(); switch (tag) { case 0: done = true; break; case 8: { if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { featureIds_ = new java.util.ArrayList(); mutable_bitField0_ |= 0x00000001; } featureIds_.add(input.readInt32()); break; } case 10: { int length = input.readRawVarint32(); int limit = input.pushLimit(length); if (!((mutable_bitField0_ & 0x00000001) == 0x00000001) && input.getBytesUntilLimit() > 0) { featureIds_ = new java.util.ArrayList(); mutable_bitField0_ |= 0x00000001; } while (input.getBytesUntilLimit() > 0) { featureIds_.add(input.readInt32()); } input.popLimit(limit); break; } case 21: { if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { logitsPath_ = new java.util.ArrayList(); mutable_bitField0_ |= 0x00000002; } logitsPath_.add(input.readFloat()); break; } case 18: { int length = input.readRawVarint32(); int limit = input.pushLimit(length); if (!((mutable_bitField0_ & 0x00000002) == 0x00000002) && input.getBytesUntilLimit() > 0) { logitsPath_ = new java.util.ArrayList(); mutable_bitField0_ |= 0x00000002; } while (input.getBytesUntilLimit() > 0) { logitsPath_.add(input.readFloat()); } input.popLimit(limit); break; } default: { if (!parseUnknownFieldProto3( input, unknownFields, extensionRegistry, tag)) { done = true; } break; } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { throw e.setUnfinishedMessage(this); } catch (java.io.IOException e) { throw new com.google.protobuf.InvalidProtocolBufferException( e).setUnfinishedMessage(this); } finally { if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { featureIds_ = java.util.Collections.unmodifiableList(featureIds_); } if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { logitsPath_ = java.util.Collections.unmodifiableList(logitsPath_); } this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return org.tensorflow.framework.BoostedTreesProtos.internal_static_tensorflow_boosted_trees_DebugOutput_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { return org.tensorflow.framework.BoostedTreesProtos.internal_static_tensorflow_boosted_trees_DebugOutput_fieldAccessorTable .ensureFieldAccessorsInitialized( org.tensorflow.framework.DebugOutput.class, org.tensorflow.framework.DebugOutput.Builder.class); } public static final int FEATURE_IDS_FIELD_NUMBER = 1; private java.util.List featureIds_; /** *
   * Return the logits and associated feature splits across prediction paths for
   * each tree, for every example, at predict time. We will use these values to
   * compute DFCs in Python, by subtracting each child prediction from its
   * parent prediction and associating this change with its respective feature
   * id.
   * 
* * repeated int32 feature_ids = 1; */ public java.util.List getFeatureIdsList() { return featureIds_; } /** *
   * Return the logits and associated feature splits across prediction paths for
   * each tree, for every example, at predict time. We will use these values to
   * compute DFCs in Python, by subtracting each child prediction from its
   * parent prediction and associating this change with its respective feature
   * id.
   * 
* * repeated int32 feature_ids = 1; */ public int getFeatureIdsCount() { return featureIds_.size(); } /** *
   * Return the logits and associated feature splits across prediction paths for
   * each tree, for every example, at predict time. We will use these values to
   * compute DFCs in Python, by subtracting each child prediction from its
   * parent prediction and associating this change with its respective feature
   * id.
   * 
* * repeated int32 feature_ids = 1; */ public int getFeatureIds(int index) { return featureIds_.get(index); } private int featureIdsMemoizedSerializedSize = -1; public static final int LOGITS_PATH_FIELD_NUMBER = 2; private java.util.List logitsPath_; /** * repeated float logits_path = 2; */ public java.util.List getLogitsPathList() { return logitsPath_; } /** * repeated float logits_path = 2; */ public int getLogitsPathCount() { return logitsPath_.size(); } /** * repeated float logits_path = 2; */ public float getLogitsPath(int index) { return logitsPath_.get(index); } private int logitsPathMemoizedSerializedSize = -1; private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { byte isInitialized = memoizedIsInitialized; if (isInitialized == 1) return true; if (isInitialized == 0) return false; memoizedIsInitialized = 1; return true; } @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); if (getFeatureIdsList().size() > 0) { output.writeUInt32NoTag(10); output.writeUInt32NoTag(featureIdsMemoizedSerializedSize); } for (int i = 0; i < featureIds_.size(); i++) { output.writeInt32NoTag(featureIds_.get(i)); } if (getLogitsPathList().size() > 0) { output.writeUInt32NoTag(18); output.writeUInt32NoTag(logitsPathMemoizedSerializedSize); } for (int i = 0; i < logitsPath_.size(); i++) { output.writeFloatNoTag(logitsPath_.get(i)); } unknownFields.writeTo(output); } @java.lang.Override public int getSerializedSize() { int size = memoizedSize; if (size != -1) return size; size = 0; { int dataSize = 0; for (int i = 0; i < featureIds_.size(); i++) { dataSize += com.google.protobuf.CodedOutputStream .computeInt32SizeNoTag(featureIds_.get(i)); } size += dataSize; if (!getFeatureIdsList().isEmpty()) { size += 1; size += com.google.protobuf.CodedOutputStream .computeInt32SizeNoTag(dataSize); } featureIdsMemoizedSerializedSize = dataSize; } { int dataSize = 0; dataSize = 4 * getLogitsPathList().size(); size += dataSize; if (!getLogitsPathList().isEmpty()) { size += 1; size += com.google.protobuf.CodedOutputStream .computeInt32SizeNoTag(dataSize); } logitsPathMemoizedSerializedSize = dataSize; } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @java.lang.Override public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } if (!(obj instanceof org.tensorflow.framework.DebugOutput)) { return super.equals(obj); } org.tensorflow.framework.DebugOutput other = (org.tensorflow.framework.DebugOutput) obj; boolean result = true; result = result && getFeatureIdsList() .equals(other.getFeatureIdsList()); result = result && getLogitsPathList() .equals(other.getLogitsPathList()); result = result && unknownFields.equals(other.unknownFields); return result; } @java.lang.Override public int hashCode() { if (memoizedHashCode != 0) { return memoizedHashCode; } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); if (getFeatureIdsCount() > 0) { hash = (37 * hash) + FEATURE_IDS_FIELD_NUMBER; hash = (53 * hash) + getFeatureIdsList().hashCode(); } if (getLogitsPathCount() > 0) { hash = (37 * hash) + LOGITS_PATH_FIELD_NUMBER; hash = (53 * hash) + getLogitsPathList().hashCode(); } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } public static org.tensorflow.framework.DebugOutput parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static org.tensorflow.framework.DebugOutput parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static org.tensorflow.framework.DebugOutput parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static org.tensorflow.framework.DebugOutput parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static org.tensorflow.framework.DebugOutput parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static org.tensorflow.framework.DebugOutput parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static org.tensorflow.framework.DebugOutput parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } public static org.tensorflow.framework.DebugOutput parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input, extensionRegistry); } public static org.tensorflow.framework.DebugOutput parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input); } public static org.tensorflow.framework.DebugOutput parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } public static org.tensorflow.framework.DebugOutput parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } public static org.tensorflow.framework.DebugOutput parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input, extensionRegistry); } @java.lang.Override public Builder newBuilderForType() { return newBuilder(); } public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } public static Builder newBuilder(org.tensorflow.framework.DebugOutput prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override public Builder toBuilder() { return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); } @java.lang.Override protected Builder newBuilderForType( com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { Builder builder = new Builder(parent); return builder; } /** *
   * DebugOutput contains outputs useful for debugging/model interpretation, at
   * the individual example-level. Debug outputs that are available to the user
   * are: 1) Directional feature contributions (DFCs) 2) Node IDs for ensemble
   * prediction path 3) Leaf node IDs.
   * 
* * Protobuf type {@code tensorflow.boosted_trees.DebugOutput} */ public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:tensorflow.boosted_trees.DebugOutput) org.tensorflow.framework.DebugOutputOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return org.tensorflow.framework.BoostedTreesProtos.internal_static_tensorflow_boosted_trees_DebugOutput_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { return org.tensorflow.framework.BoostedTreesProtos.internal_static_tensorflow_boosted_trees_DebugOutput_fieldAccessorTable .ensureFieldAccessorsInitialized( org.tensorflow.framework.DebugOutput.class, org.tensorflow.framework.DebugOutput.Builder.class); } // Construct using org.tensorflow.framework.DebugOutput.newBuilder() private Builder() { maybeForceBuilderInitialization(); } private Builder( com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); maybeForceBuilderInitialization(); } private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessageV3 .alwaysUseFieldBuilders) { } } @java.lang.Override public Builder clear() { super.clear(); featureIds_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000001); logitsPath_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000002); return this; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { return org.tensorflow.framework.BoostedTreesProtos.internal_static_tensorflow_boosted_trees_DebugOutput_descriptor; } @java.lang.Override public org.tensorflow.framework.DebugOutput getDefaultInstanceForType() { return org.tensorflow.framework.DebugOutput.getDefaultInstance(); } @java.lang.Override public org.tensorflow.framework.DebugOutput build() { org.tensorflow.framework.DebugOutput result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } @java.lang.Override public org.tensorflow.framework.DebugOutput buildPartial() { org.tensorflow.framework.DebugOutput result = new org.tensorflow.framework.DebugOutput(this); int from_bitField0_ = bitField0_; if (((bitField0_ & 0x00000001) == 0x00000001)) { featureIds_ = java.util.Collections.unmodifiableList(featureIds_); bitField0_ = (bitField0_ & ~0x00000001); } result.featureIds_ = featureIds_; if (((bitField0_ & 0x00000002) == 0x00000002)) { logitsPath_ = java.util.Collections.unmodifiableList(logitsPath_); bitField0_ = (bitField0_ & ~0x00000002); } result.logitsPath_ = logitsPath_; onBuilt(); return result; } @java.lang.Override public Builder clone() { return (Builder) super.clone(); } @java.lang.Override public Builder setField( com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { return (Builder) super.setField(field, value); } @java.lang.Override public Builder clearField( com.google.protobuf.Descriptors.FieldDescriptor field) { return (Builder) super.clearField(field); } @java.lang.Override public Builder clearOneof( com.google.protobuf.Descriptors.OneofDescriptor oneof) { return (Builder) super.clearOneof(oneof); } @java.lang.Override public Builder setRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { return (Builder) super.setRepeatedField(field, index, value); } @java.lang.Override public Builder addRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { return (Builder) super.addRepeatedField(field, value); } @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { if (other instanceof org.tensorflow.framework.DebugOutput) { return mergeFrom((org.tensorflow.framework.DebugOutput)other); } else { super.mergeFrom(other); return this; } } public Builder mergeFrom(org.tensorflow.framework.DebugOutput other) { if (other == org.tensorflow.framework.DebugOutput.getDefaultInstance()) return this; if (!other.featureIds_.isEmpty()) { if (featureIds_.isEmpty()) { featureIds_ = other.featureIds_; bitField0_ = (bitField0_ & ~0x00000001); } else { ensureFeatureIdsIsMutable(); featureIds_.addAll(other.featureIds_); } onChanged(); } if (!other.logitsPath_.isEmpty()) { if (logitsPath_.isEmpty()) { logitsPath_ = other.logitsPath_; bitField0_ = (bitField0_ & ~0x00000002); } else { ensureLogitsPathIsMutable(); logitsPath_.addAll(other.logitsPath_); } onChanged(); } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @java.lang.Override public final boolean isInitialized() { return true; } @java.lang.Override public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { org.tensorflow.framework.DebugOutput parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { parsedMessage = (org.tensorflow.framework.DebugOutput) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { if (parsedMessage != null) { mergeFrom(parsedMessage); } } return this; } private int bitField0_; private java.util.List featureIds_ = java.util.Collections.emptyList(); private void ensureFeatureIdsIsMutable() { if (!((bitField0_ & 0x00000001) == 0x00000001)) { featureIds_ = new java.util.ArrayList(featureIds_); bitField0_ |= 0x00000001; } } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public java.util.List getFeatureIdsList() { return java.util.Collections.unmodifiableList(featureIds_); } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public int getFeatureIdsCount() { return featureIds_.size(); } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public int getFeatureIds(int index) { return featureIds_.get(index); } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public Builder setFeatureIds( int index, int value) { ensureFeatureIdsIsMutable(); featureIds_.set(index, value); onChanged(); return this; } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public Builder addFeatureIds(int value) { ensureFeatureIdsIsMutable(); featureIds_.add(value); onChanged(); return this; } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public Builder addAllFeatureIds( java.lang.Iterable values) { ensureFeatureIdsIsMutable(); com.google.protobuf.AbstractMessageLite.Builder.addAll( values, featureIds_); onChanged(); return this; } /** *
     * Return the logits and associated feature splits across prediction paths for
     * each tree, for every example, at predict time. We will use these values to
     * compute DFCs in Python, by subtracting each child prediction from its
     * parent prediction and associating this change with its respective feature
     * id.
     * 
* * repeated int32 feature_ids = 1; */ public Builder clearFeatureIds() { featureIds_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000001); onChanged(); return this; } private java.util.List logitsPath_ = java.util.Collections.emptyList(); private void ensureLogitsPathIsMutable() { if (!((bitField0_ & 0x00000002) == 0x00000002)) { logitsPath_ = new java.util.ArrayList(logitsPath_); bitField0_ |= 0x00000002; } } /** * repeated float logits_path = 2; */ public java.util.List getLogitsPathList() { return java.util.Collections.unmodifiableList(logitsPath_); } /** * repeated float logits_path = 2; */ public int getLogitsPathCount() { return logitsPath_.size(); } /** * repeated float logits_path = 2; */ public float getLogitsPath(int index) { return logitsPath_.get(index); } /** * repeated float logits_path = 2; */ public Builder setLogitsPath( int index, float value) { ensureLogitsPathIsMutable(); logitsPath_.set(index, value); onChanged(); return this; } /** * repeated float logits_path = 2; */ public Builder addLogitsPath(float value) { ensureLogitsPathIsMutable(); logitsPath_.add(value); onChanged(); return this; } /** * repeated float logits_path = 2; */ public Builder addAllLogitsPath( java.lang.Iterable values) { ensureLogitsPathIsMutable(); com.google.protobuf.AbstractMessageLite.Builder.addAll( values, logitsPath_); onChanged(); return this; } /** * repeated float logits_path = 2; */ public Builder clearLogitsPath() { logitsPath_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFieldsProto3(unknownFields); } @java.lang.Override public final Builder mergeUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { return super.mergeUnknownFields(unknownFields); } // @@protoc_insertion_point(builder_scope:tensorflow.boosted_trees.DebugOutput) } // @@protoc_insertion_point(class_scope:tensorflow.boosted_trees.DebugOutput) private static final org.tensorflow.framework.DebugOutput DEFAULT_INSTANCE; static { DEFAULT_INSTANCE = new org.tensorflow.framework.DebugOutput(); } public static org.tensorflow.framework.DebugOutput getDefaultInstance() { return DEFAULT_INSTANCE; } private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override public DebugOutput parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return new DebugOutput(input, extensionRegistry); } }; public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override public org.tensorflow.framework.DebugOutput getDefaultInstanceForType() { return DEFAULT_INSTANCE; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy