Project

General

Profile

Download (4.64 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebasesPruning.java @ f079bf77

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.tablebases;
11

    
12
import android.content.res.Resources;
13

    
14
import java.io.ByteArrayOutputStream;
15
import java.io.IOException;
16
import java.io.InputStream;
17

    
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
public abstract class TablebasesPruning extends TablebasesAbstract
21
{
22
  private boolean mInitialized;
23
  private PruningTable[] mHighTables;
24
  private PruningTable[] mMidTables;
25
  private int mGodsNumber, mLowestHigh, mHighestMid, mLowestMid;
26

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

    
29
  abstract int[] getMidPruningLevels();
30
  abstract int[] getHighPruningLevels();
31
  abstract int getGodsNumber();
32

    
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34

    
35
  private PruningTable createPruningTable(Resources res, int id)
36
    {
37
    InputStream stream = res.openRawResource(id);
38
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
39

    
40
    int nRead;
41
    byte[] tmp = new byte[16384];
42

    
43
    try
44
      {
45
      while ((nRead = stream.read(tmp, 0, tmp.length)) != -1)
46
        {
47
        buffer.write(tmp, 0, nRead);
48
        }
49
      stream.close();
50
      byte[] data = buffer.toByteArray();
51
      buffer.close();
52
      return new PruningTable(data);
53
      }
54
    catch(IOException ex)
55
      {
56
      mInitialized = false;
57
      return null;
58
      }
59
    }
60

    
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

    
63
  public TablebasesPruning()
64
    {
65
    super();
66
    mGodsNumber = getGodsNumber();
67
    mInitialized = false;
68
    }
69

    
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

    
72
  public TablebasesPruning(Resources res, int[] midIDs, int[] highIDs)
73
    {
74
    super();
75

    
76
    int mid = midIDs !=null ? midIDs.length  : 0;
77
    int high= highIDs!=null ? highIDs.length : 0;
78

    
79
    mMidTables = mid >0 ? new PruningTable[mid] : null;
80
    mHighTables= high>0 ? new PruningTable[high]: null;
81
    mGodsNumber = getGodsNumber();
82
    mInitialized = true;
83

    
84
    for(int i=0; i<mid ; i++) mMidTables[i] = createPruningTable(res,midIDs[i] );
85
    for(int i=0; i<high; i++) mHighTables[i]= createPruningTable(res,highIDs[i]);
86
    }
87

    
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89

    
90
  public byte[][] getPacked()
91
    {
92
    if( !mInitialized )
93
      {
94
      int[] midLevels = getMidPruningLevels();
95
      int numMidLevels= midLevels!=null ? midLevels.length : 0;
96
      int[] highLevels = getHighPruningLevels();
97
      int numHighLevels= highLevels!=null ? highLevels.length : 0;
98
      int maxLevel = 0;
99

    
100
      if( highLevels!=null )
101
        {
102
        for( int l : highLevels )
103
          if( l>maxLevel ) maxLevel = l;
104
        }
105
      else
106
        {
107
        if( midLevels!=null )
108
          for( int l : midLevels )
109
            if( l>maxLevel ) maxLevel = l;
110
        }
111

    
112
      createTablebase(maxLevel);
113
      mMidTables = numMidLevels >0 ? new PruningTable[numMidLevels ] : null;
114
      mHighTables= numHighLevels>0 ? new PruningTable[numHighLevels] : null;
115

    
116
      for(int i=0; i<numMidLevels; i++)
117
        mMidTables[i] = new PruningTable(mTablebase,midLevels[i]);
118
      for(int i=0; i<numHighLevels; i++)
119
        mHighTables[i] = new PruningTable(mTablebase,highLevels[i]);
120

    
121
      mInitialized = true;
122
      }
123

    
124
    int midNum  = mMidTables !=null ? mMidTables.length  : 0;
125
    int highNum = mHighTables!=null ? mHighTables.length : 0;
126
    byte[][] data = new byte[midNum+highNum][];
127

    
128
    for(int i=0; i<midNum ; i++) data[i       ] = mMidTables[i].getPacked();
129
    for(int i=0; i<highNum; i++) data[i+midNum] = mHighTables[i].getPacked();
130

    
131
    return data;
132
    }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

    
136
  public int[][] solution(int index, int[] extra)
137
    {
138
    return null;
139
    }
140
}
(9-9/12)